目录
Java集合Map
HashMap的特性是什么?
HashMap 是 Java 中的一个核心类,它实现了 Map 接口,用于存储键值对(key-value pairs)。以下是 HashMap 的一些关键特性和行为:
基本特性
-
基于哈希表:
- HashMap 使用哈希表来存储数据,这使得它能够提供快速的查找、插入和删除操作。
-
键值对存储:
- HashMap 存储了键值对,其中键和值可以是任何对象。
-
键的唯一性:
- HashMap 不允许有重复的键,如果插入了相同的键,则新的值会替换旧的值。
-
允许空键和空值:
- HashMap 允许键为
null
,也允许值为null
。
- HashMap 允许键为
-
非线程安全:
- HashMap 不是线程安全的,这意味着在没有外部同步的情况下,多个线程同时修改 HashMap 可能会导致不可预知的结果。
动态扩容
-
动态扩容:
- 当 HashMap 中的元素数量超过负载因子(Load Factor)和当前容量的乘积时,HashMap 会进行扩容,通常是将容量增加到原来的两倍。
-
负载因子:
- HashMap 有一个负载因子,它是一个衡量哈希表满的程度的值。默认情况下,负载因子是 0.75,这意味着当哈希表的填充度达到 75% 时,HashMap 会进行扩容。
哈希冲突解决
- 哈希冲突解决:
- HashMap 使用链表来解决哈希冲突,当链表长度超过一定阈值(在 JDK 1.8 中是 8)时,链表会转换成红黑树,以提高搜索效率。
迭代顺序
- 迭代顺序:
- 在 JDK 1.8 及以后的版本中,HashMap 的迭代顺序是按照插入顺序来的,而在 JDK 1.7 及以前的版本中,迭代顺序是不确定的。
性能
-
快速失败的迭代器:
- HashMap 提供的迭代器是快速失败的,这意味着在迭代过程中,如果检测到 HashMap 发生了结构性修改(除了迭代器自身的
remove
方法),迭代器会立即抛出ConcurrentModificationException
。
- HashMap 提供的迭代器是快速失败的,这意味着在迭代过程中,如果检测到 HashMap 发生了结构性修改(除了迭代器自身的
-
性能:
- 在哈希函数分布均匀且没有太多哈希冲突的情况下,HashMap 提供了常数时间的性能(O(1))来快速访问键值对。
容量和初始容量
-
初始容量:
- HashMap 有一个初始容量,如果不指定,那么默认的初始容量是 16。
-
容量总是2的幂:
- HashMap 的容量总是保持为2的幂,这是为了使得哈希值分布均匀,减少哈希冲突。
使用示例
HashMap<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
map.put("three", 3);
// 获取值
Integer value = map.get("two"); // 返回 2
// 检查键是否存在
boolean containsKey = map.containsKey("three"); // 返回 true
// 删除键值对
map.remove("one");
// 遍历 HashMap
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry