🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] # java.util.Map ![](https://img.kancloud.cn/11/85/11851ea349624a042fc85d13c9f78c72_675x312.png) 1. `java.util.Map<K,V>`集合中存取元素的基本单位是:单对元素,其中类型参数如下: * **K** - 此映射所维护的键(Key)的类型,相当于目录。 * **V** - 映射值(Value)的类型,相当于内容。 2. 该集合中**key是不允许重复**的,而且**一个key只能对应一个value** 3. **主要实现**类有:`HashMap`类、`TreeMap`类、`LinkedHashMap`类、`Hashtable`类、`Properties`类 * **HashMap类**的底层是采用**哈希表进行数据管理**的 * **TreeMap类**的底层是采用**红黑树进行数据管理**的 * **LinkedHashMap类**内部维护了一个**双向链表**,链表中记录了元素的迭代顺序,也就是元素插入集合中的先后顺序,因此便于迭代 * **Hashtable类**与**HashMap类**相比属于**线程安全**的类,且**不允许null作为key或者value的数值** * **Properties类是Hashtable类的子类**,该对象用于处理属性文件,key和value都是String类型的 4. **Map集合是面向查询优化的数据结构, 在大数据量情况下有着优良的查询性能** 5. 经常用于根据**key检索value**的业务场景 >[danger] ##### 常用方法 |方法声明 |功能介绍| | -- |--| |V put(K key, V value)| 将Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对应的Value,返回值为该Key原来所对应的Value,若没有则返回null| |V get(Object key) |返回与参数Key所对应的Value对象,如果不存在则返回null| |boolean containsKey(Object key);|判断集合中是否包含指定的Key| |boolean containsValue (Object value);|判断集合中是否包含指定的Value| |V remove(Object key) |根据参数指定的key进行删除| |Set keySet() |返回此映射中包含的键的Set视图| |Collection values()| 返回此映射中包含的值的Set视图| |Set<Map.Entry<K,V>> entrySet()| 返回此映射中包含的映射的Set视图| ~~~ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapTest { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); // put 添加元素 String str = map.put("1", "11"); System.out.println(str); // null 如果添加key 不存在怎返回null map.put("2", "22"); map.put("3", "33"); System.out.println(map); // {1=11, 2=22, 3=33} 自动调用toString 方法 // 修改元素 str = map.put("2", "6666"); // 如果key 存在则修改 System.out.println(str); // 22 key 存在获取修改前的对应value 值 System.out.println(map); // {1=11, 2=6666, 3=33} 自动调用toString 方法 // containsKey 查找map中 key 是否存在 boolean b1 = map.containsKey("1"); System.out.println(b1); // true // containsValue 查找map中 value 是否存在 b1 = map.containsValue("1"); System.out.println(b1);// false // get 根据key 获取value String val = map.get("1"); System.out.println(val); // 11 val = map.get("123"); System.out.println(val); // null 查找的值不存在 // 删除元素 str = map.remove("1"); System.out.println("被删除的value是:" + str); // 被删除的value是:11 System.out.println("map = " + map); // map = {2=6666, 3=33} // keySet 获取所有key - 遍历所有key Set<String> keys = map.keySet(); for (String key : keys) { System.out.println(key); // 2 3 } // 获取所有value - 打印所有value Collection<String> co = map.values(); for (String ts : co) { System.out.println("ts = " + ts); // ts = 6666 ts = 33 } // entrySet 获取键值对 Set<Map.Entry<String, String>> entries = map.entrySet(); for (Map.Entry<String, String> me : entries) { System.out.println(me); // 2=6666 3=33 } } } ~~~ >[danger] ##### 原理 1. 使用元素的**key调用hashCode方法获取对应的哈希码值**,再由某种哈希算法计算在数组中的索引位置。 2. 若该位置**没有元素**,则将该键值对直接放入即可。 3. 若该位置**有元素**,则使用key与已有元素依次比较哈希值,若哈希值不相同,则将该元素直接放入。 4. 若key与**已有元素的哈希值相同**,则使用key调用equals方法与已有元素依次比较。 5. 若**相等**则将对应的value修改,否则将键值对直接放入即可