Java HashMap
HashMap是Java集合框架中最常用的实现类之一,它允许我们存储键值对(key-value pairs),并提供了 高效的数据检索机制。本文将从基础开始,全面介绍HashMap的概念、特点、使用方法及实际应用场景。
什么是HashMap?
HashMap是基于哈希表实现的Map接口,它存储的内容是键值对(key-value)映射。HashMap特点如下:
- 实现了Map接口
- 允许null键和null值
- 不保证映射的顺序
- 假设哈希函数将元素均匀分布,则HashMap的增删改查操作的时间复杂度接近O(1)
- 非线程安全
HashMap的基本原理
HashMap内部使用数组+链表(JDK 1.8后加入红黑树)的数据结构实现:
- 通过hash函数将key映射到数组的某个位置
- 如果多个key映射到同一位置(称为"碰撞"或"冲突"),则使用链表存储
- 当链表长度超过阈值(默认为8)时,链表会转换为红黑树以提高性能
创建HashMap
可以使用以下几种方式创建HashMap:
// 创建一个空的HashMap
HashMap<String, Integer> map1 = new HashMap<>();
// 创建一个指定初始容量的HashMap
HashMap<String, Integer> map2 = new HashMap<>(16);
// 创建一个指定初始容量和加载因子的HashMap
HashMap<String, Integer> map3 = new HashMap<>(16, 0.75f);
// 从另一个Map创建HashMap
Map<String, Integer> existingMap = new HashMap<>();
existingMap.put("one", 1);
existingMap.put("two", 2);
HashMap<String, Integer> map4 = new HashMap<>(existingMap);
HashMap常用方法
下面是HashMap的常用操作:
添加元素
HashMap<String, Integer> scores = new HashMap<>();
// 添加键值对
scores.put("Alice", 95);
scores.put("Bob", 85);
scores.put("Charlie", 90);
System.out.println(scores);
// 输出:{Bob=85, Alice=95, Charlie=90}
获取元素
// 获取指定键的值
Integer bobScore = scores.get("Bob");
System.out.println("Bob的分数: " + bobScore);
// 输出:Bob的分数: 85
// 获取不存在的键
Integer davidScore = scores.get("David");
System.out.println("David的分数: " + davidScore);
// 输出:David的分数: null
// 获取带默认值
Integer davidScoreWithDefault = scores.getOrDefault("David", 0);
System.out.println("David的分数(默认值): " + davidScoreWithDefault);
// 输出:David的分数(默认值): 0
检查键或值
// 检查是否包含某个键
boolean hasAlice = scores.containsKey("Alice");
System.out.println("是否包含Alice: " + hasAlice);
// 输出:是否包含Alice: true
// 检查是否包含某个值
boolean has90 = scores.containsValue(90);
System.out.println("是否包含90分: " + has90);
// 输出:是否包含90分: true
删除元素
// 删除指定键的元素
Integer removedScore = scores.remove("Bob");
System.out.println("被删除的Bob分数: " + removedScore);
// 输出:被删除的Bob分数: 85
System.out.println(scores);
// 输出:{Alice=95, Charlie=90}