目录
1基本概念
2数据结构
3常用操作
3.1 put(K key, V value):插入键值对。
3.2 get(Object key):根据键获取值。
3.3 remove(Object key):移除键值对。
3.4 containsKey(Object key):判断Map中是否包含指定的键。
3.5 containsValue(Object value):判断Map中是否包含指定的值。、
3.6 keySet():返回Map中所有键的集合。
3.7 values():返回Map中所有值的集合。
3.8 entrySet():返回Map中所有键值对的集合。
3.9 类计数数组作用。
优缺点:
注意事项:
1基本概念
- HashMap是Java集合框架中的一个类,实现了Map接口。
- 它使用键值对(key-value)的方式存储数据,允许使用null键和null值(但null键只能有一个)。
- HashMap不保证映射的顺序,即插入顺序和遍历顺序可能不同。
2数据结构
- JDK 1.7及以前:HashMap的底层实现是数组+链表(每个数组存放一个链表的头结点)。
- JDK 1.8及以后:HashMap的底层实现优化为数组+链表或红黑树。当链表长度超过一定阈值(默认为8)时,会自动将链表转换为红黑树,以提高查找效率
- HashMap使用哈希函数将键映射到数组的索引位置。
- 如果多个键映射到同一个索引位置,则使用链表或红黑树来处理哈希冲突。
假如我们输入1,4,5,6,7,9这串数字,那么其内部就是这样的结构。
3常用操作
-
3.1 put(K key, V value)
:插入键值对。 - 注意:由于 key 值唯一,存放相同 key 的 value 值时,后放入的值会覆盖之前的value值。
-
HashMap<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2);
-
3.2
get(Object key)
:根据键获取值。 -
Integer value = map.get("apple"); System.out.println(value); // 输出: 1
-
getOrDefault():根据键获取值,若没有则返回默认值。
-
Integer value = map.getOrDefault(apple,10);//若没有对应的key值的返回 10
-
3.3 remove(Object key)
:移除键值对。 -
map.remove("banana");
-
3.4 containsKey(Object key)
:判断Map中是否包含指定的键。 -
boolean containsKey = map.containsKey("apple"); System.out.println(containsKey); // 输出: true
-
3.5 containsValue(Object value)
:判断Map中是否包含指定的值。、 -
boolean containsValue = map.containsValue(1); System.out.println(containsValue); // 输出: true
-
3.6 keySet()
:返回Map中所有键的集合。 -
我们常常用foreach循环来遍历map中的key值Set<String> keySet = map.keySet(); System.out.println(keySet); // 输出: [apple] (假设已移除banana)
-
for (Integer key: map.keySet()) { if(map.get(key)==1){ return key; } }
-
3.7 values()
:返回Map中所有值的集合。 -
Set<String> keySet = map.keySet(); System.out.println(keySet); // 输出: [apple] (假设已移除banana)
-
3.8 entrySet()
:返回Map中所有键值对的集合。 -
Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); for (Map.Entry<String, Integer> entry : entrySet) { System.out.println(entry.getKey() + ": " + entry.getValue()); }
-
3.9 类计数数组作用
。 - 除了上面这些作用,我们还常常利用put和getOrDefault来模拟计数数组的作用
-
for (int i = 0; i < nums.length; i++) { map.put(nums[i],map.getOrDefault(nums[i],0)+1); }
这样 map 中的 value 值就等于 k 其 key 值在 nums 数组中出现的次数
优缺点:
- 缺点:非线程安全、不保证顺序。
- 快速查找(平均时间复杂度为O(1))、灵活(可以存储不同类型的对象)
注意事项:
- HashMap的扩容机制:当容量达到阈值(默认是当前容量的0.75倍)时,会发生扩容,容量变为原来的两倍,此时需要重新哈希已有的键值对。