Java之Map的使用场景

本文深入解析了Java中Map接口的特点及其实现类HashMap与LinkedHashMap的使用方法,包括存储自定义类型的键值对、保证键的唯一性以及如何实现键值对的有序存储。

总结之 Map接口 的使用场景(day04)

  Map:
    Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值
    Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

    特点:
      键不重复,值可以重复
      每个键只能对应一个值

    子类:
      HashMap:
        存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,
        需要重写键的hashCode()方法、equals()方法。
      LinkedHashMap
        HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。
        通过链表结构可以保证元素的存取顺序一致;
        通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

    常用方法:
      - public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
      - public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
      - public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
      - public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
      - public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

    notes:
      使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,
      并把指定的键值添加到集合中;

      若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),
      并把指定键所对应的值,替换成指定的新值。

    遍历方法:
      the fist way
        键找值方式:即通过元素中的键,获取键所对应的值
        分析步骤:用keyset()
        ①获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有键,
        ②遍历所有的键
        ③根据键找对应的值

      the scecond way
        Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法
        - public K getKey():获取Entry对象中的键。
        - public V getValue():获取Entry对象中的值。
        在Map集合中也提供了获取所有Entry对象的方法:

        - public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

        ①获取Map集合中,所有的键值对 Entry对象 以Set的形式返回,entrySet()
        ②遍历包含键值对 对象的 集合 拿到 每一对键值对 对象
        ③通过键值对 对象 获取Entry对象中的键与值 方法提示 getKey() getValue()


    1.HashMap
      ①HashMap存储自定义类型键值
        - 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,
        必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。
        - 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。
      2LinkedHashMap
      ① 使无序的 HashMap变的有序

### JavaMap的详细解释 MapJava中的一个接口,它没有继承Collection接口,提供了key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,其内容可以被当作一组key集合、一组value集合,或者一组key - value映射[^1]。 Map集合的数据结构仅仅针对键有效,与值无关,存储的是键值对形式的元素,键唯一,值可重复[^2]。以下是几种常见的Map实现类及其特点: - **HashMap**:底层数据结构是哈希表,线程不安全,效率高。哈希表依赖 `hashCode()` 和 `equals()` 方法来判断元素是否重复。具体执行顺序为,首先判断 `hashCode()` 值是否相同,若相同则继续执行 `equals()` 方法,若 `equals()` 返回 `true` 说明元素重复,不添加;若返回 `false` 则直接添加到集合;若 `hashCode()` 值不同则直接添加到集合。通常自动生成 `hashCode()` 和 `equals()` 方法即可[^2]。 ```java import java.util.HashMap; import java.util.Map; public class HashMapExample { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); System.out.println(map.get("apple")); } } ``` - **LinkedHashMap**:底层数据结构由链表和哈希表组成。链表保证元素有序,哈希表保证元素唯一[^2]。 ```java import java.util.LinkedHashMap; import java.util.Map; public class LinkedHashMapExample { public static void main(String[] args) { Map<String, Integer> map = new LinkedHashMap<>(); map.put("apple", 1); map.put("banana", 2); for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` - **Hashtable**:底层数据结构是哈希表,线程安全,效率低。其哈希表判断元素是否重复的执行顺序与HashMap类似,同样依赖 `hashCode()` 和 `equals()` 方法。并且也需要自动生成 `hashCode()` 和 `equals()` 方法[^2]。 ```java import java.util.Hashtable; import java.util.Map; public class HashtableExample { public static void main(String[] args) { Map<String, Integer> map = new Hashtable<>(); map.put("apple", 1); map.put("banana", 2); System.out.println(map.get("apple")); } } ``` - **TreeMap**:底层数据结构是红黑树(一种自平衡的二叉树),根据比较的返回值是否为0来决定保证元素唯一性。有两种排序方式,自然排序(元素具备比较性,让元素所属的类实现 `Comparable` 接口)和比较器排序(集合具备比较性,让集合接收一个 `Comparator` 的实现类对象)[^2]。 ```java import java.util.Map; import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { Map<String, Integer> map = new TreeMap<>(); map.put("apple", 1); map.put("banana", 2); for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` ### JavaMap使用场景 - **数据缓存**:在需要频繁访问某些数据,且这些数据的生成或获取成本较高时,可以使用Map作为缓存。例如,在一个Web应用中,经常需要查询用户信息,为了减少数据库的访问次数,可以将用户信息存储在Map中。 ```java import java.util.HashMap; import java.util.Map; class User { private String id; private String name; public User(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public String getName() { return name; } } public class UserCache { private static Map<String, User> userCache = new HashMap<>(); public static User getUser(String id) { if (userCache.containsKey(id)) { return userCache.get(id); } // 模拟从数据库获取用户信息 User user = new User(id, "User_" + id); userCache.put(id, user); return user; } public static void main(String[] args) { User user = getUser("1"); System.out.println(user.getName()); } } ``` - **数据统计**:当需要统计某些数据的出现次数时,Map可以很好地发挥作用。例如,统计一段文本中每个单词的出现次数。 ```java import java.util.HashMap; import java.util.Map; public class WordCount { public static void main(String[] args) { String text = "hello world hello java"; String[] words = text.split(" "); Map<String, Integer> wordCountMap = new HashMap<>(); for (String word : words) { wordCountMap.put(word, wordCountMap.getOrDefault(word, 0) + 1); } for (Map.Entry<String, Integer> entry : wordCountMap.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` - **配置管理**:可以使用Map来存储应用程序的配置信息,方便统一管理和获取。 ```java import java.util.HashMap; import java.util.Map; public class ConfigManager { private static Map<String, String> configMap = new HashMap<>(); static { configMap.put("db.url", "jdbc:mysql://localhost:3306/test"); configMap.put("db.username", "root"); configMap.put("db.password", "password"); } public static String getConfig(String key) { return configMap.get(key); } public static void main(String[] args) { System.out.println(getConfig("db.url")); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值