HashMap
Java中的HashMap
是一个基于哈希表的映射接口的实现,它存储键值对,并允许快速检索。以下是HashMap
的一些核心知识点总结:
1. 基本概念
- 键值对:
HashMap
存储数据的形式,每个键(Key)唯一地映射到一个值(Value)。 - 哈希表:
HashMap
内部使用哈希表来存储数据,哈希表是一个数组,数组的每个元素是一个链表(或树,在Java 8及以上版本中)。
2. 特点
- 键的唯一性:
HashMap
中的键必须是唯一的,不允许重复。 - 值的可重复性:值可以重复。
- 无序性:
HashMap
不保证元素的顺序,且在不同时间可能因哈希碰撞而改变顺序。 - 线程不安全:
HashMap
不是线程安全的,多线程操作需要外部同步。
3. 构造函数
HashMap()
:默认构造函数,默认初始容量为16,加载因子为0.75。HashMap(int initialCapacity)
:指定初始容量的构造函数。HashMap(int initialCapacity, float loadFactor)
:指定初始容量和加载因子的构造函数。
4. 关键方法
put(K key, V value)
:添加或更新键值对。get(Object key)
:根据键获取值。remove(Object key)
:根据键删除键值对。containsKey(Object key)
:检查是否包含指定的键。size()
:返回HashMap
中键值对的数量。isEmpty()
:检查HashMap
是否为空。clear()
:清空HashMap
。
5. 哈希函数
HashMap
使用哈希函数来计算键的哈希码,哈希码决定了键在哈希表中的位置。
6. 加载因子和扩容
- 加载因子(Load Factor):默认为0.75,表示哈希表填充的程度,当哈希表达到这个比例时,就会进行扩容。
- 扩容(Resizing):当哈希表的容量达到加载因子所设定的阈值时,
HashMap
会进行扩容操作,通常是容量翻倍。
7. 碰撞处理
- 链表法:在Java 7及之前版本中,当哈希碰撞发生时,会使用链表将碰撞的元素串联起来。
- 红黑树:在Java 8及以上版本中,当链表的长度超过一定阈值(默认为8)时,链表会转换为红黑树,以减少搜索时间。
8. 迭代器
HashMap
提供了迭代器Iterator
来遍历键或键值对。
9. 性能
HashMap
提供了常数时间复杂度的基本操作,如get
和put
,前提是哈希函数能够合理地分配元素。
10. 注意事项
- 内存占用:
HashMap
在存储大量元素时会占用较多内存。 - 键的哈希码:应该合理地覆盖
Object
类的hashCode()
方法,以避免过多的哈希碰撞。 - 键的等价性:应该正确覆盖
equals()
方法,以确保键的唯一性。
11. 使用示例
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
System.out.println(map.get("Apple")); // 输出 1
// 迭代HashMap
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}