1、HashMap 是什么?它的特点是什么?
HashMap 是 Java 集合框架中的一个实现类,它基于哈希表实现。HashMap 具有以下特点:
- 键值对存储:数据以键值对的形式存储,每个键都是唯一的。
- 快速查找:通过键可以快速查找对应的值。
- 无序性:HashMap 中的键值对没有固定的顺序。
- 允许 null 键和值:HashMap 允许键和值都为 null。
- 线程不安全:HashMap 不是线程安全的集合,多线程环境下需要额外的同步措施。
2、HashMap 和 HashTable 的区别是什么?
- 线程安全性:HashMap 不是线程安全的,而 HashTable 是线程安全的,因为它使用了同步方法。
- 性能:HashMap 在多线程环境下性能更好,因为不需要额外的同步开销。HashTable 的性能在多线程环境下受到同步的影响。
- null 键和值:HashMap 允许 null 键和值,而 HashTable 不允许。
3、HashMap 的工作原理是什么?
HashMap 使用哈希表数据结构,它通过哈希函数将键映射到哈希表中的索引位置。当多个键映射到同一个索引位置时,它使用链表或红黑树等数据结构来存储这些键值对。这使得 HashMap 能够以常数时间复杂度 O(1) 来执行添加、删除和查找操作(在均匀分布的情况下)。
4、什么是哈希冲突?HashMap 如何解决哈希冲突?
哈希冲突是指不同的键经过哈希函数计算后映射到了相同的索引位置。HashMap 使用链表或红黑树等数据结构来存储具有相同哈希值的键值对。当发生冲突时,新的键值对会被添加到链表或树中,而不会覆盖原有的键值对。
5、如何遍历 HashMap 中的键值对?
可以使用迭代器(Iterator)或增强型 for 循环来遍历 HashMap 中的键值对。例如:
HashMap<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("Alice", 28);
map.put("Bob", 35);
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {String key = entry.getKey();Integer value = entry.getValue();System.out.println(key + ": " + value);
}
6、如何判断 HashMap 中是否包含某个键或值?
可以使用 containsKey(key) 方法来判断 HashMap 中是否包含指定的键,使用 containsValue(value) 方法来判断是否包含指定的值。这些方法会返回布尔值。
7、HashMap 的容量和负载因子是什么?
容量是哈希表中桶(bucket)的数量,负载因子是哈希表在扩容之前可以达到的平均负载程度。当哈希表中的元素数量达到容量乘以负载因子时,哈希表会自动进行扩容。
8、HashMap 的哈希算法是如何工作的?
HashMap 使用键的 hashCode() 方法计算哈希值,然后通过对容量取模来确定键值对应的桶索引位置。哈希算法的质量直接影响到哈希表的性能,应尽量保证哈希算法分布均匀。