一、HashMap简介
HashMap是Java中的一种数据结构,是一种散列表实现。它存储的元素是以key-value的形式进行存储,其中key必须唯一,而value可以重复。HashMap的底层实现是通过数组和链表/红黑树实现的。
在HashMap中,通过hashCode()和equals()方法来确定键值对的映射关系。其中,hashCode()方法用于计算key对应的哈希值,而equals()方法则用于比较key是否相同。
二、HashMap应用场景
1、缓存数据:HashMap中的数据可以存储在内存中,并且可以快速地进行读取,非常适合用于缓存中间数据。
2、快速数据检索:HashMap中的查询速度非常快,对于需要快速查找数据的场景来说非常适合。
3、用于统计数据:某些场景中需要对数据进行统计,HashMap可以通过key唯一来实现。
三、HashMap常用操作
1、添加元素put()
使用put()方法向HashMap中添加元素,如果key不存在则直接添加,如果key存在,则更新value的值。示例代码如下:
HashMap<String, Integer> hashMap = new HashMap<>(); hashMap.put("apple", 1); hashMap.put("banana", 2);
2、获取元素get()
使用get()方法从HashMap中获取元素,需要传入key值,如果key值不存在则返回null。示例代码如下:
Integer value = hashMap.get("apple");
3、遍历元素
3.1 遍历key值集合
使用keySet()获取HashMap中的所有key值,对于每一个key值通过get()方法获取对应的value值完成遍历。示例代码如下:
for (String key : hashMap.keySet()) { Integer value = hashMap.get(key); System.out.println(key + ":" + value); }
3.2 遍历value值集合
使用values()获取HashMap中的所有value值,对于每一个value值遍历即可。示例代码如下:
for (Integer value : hashMap.values()) { System.out.println(value); }
3.3 遍历键值对集合
使用entrySet()方法获取HashMap中的所有键值对,对于每一个键值对通过getKey()和getValue()方法获取对应的key和value值完成遍历。示例代码如下:
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + ":" + value); }
4、删除元素remove()
使用remove()方法可以删除HashMap中指定的元素,需要传入key值,删除成功返回对应的value值,失败返回null。示例代码如下:
Integer value = hashMap.remove("apple");
五、HashMap的性能分析
HashMap的性能在理论上可以达到$O(1)$的常数级别,因为它使用了哈希表实现,但是如果出现哈希碰撞的情况下,性能会下降。
另外,在JDK1.8之前,HashMap使用的是链表实现,而在JDK1.8之后,默认情况下链表长度超过8时会转换为红黑树,提升性能。
六、HashMap的注意点
1、HashMap是非线程安全的,如果需要在多线程环境下使用,需要采用线程安全的ConcurrentHashMap类。
2、HashMap的初始值大小会影响性能,在构造函数中可以设置HashMap的初始值大小,如果已知数据量大小,可以设置适当值以避免频繁进行rehash操作。
七、HashMap完整代码
import java.util.HashMap; import java.util.Map; public class HashMapDemo { public static void main(String[] args) { // 创建一个HashMap实例 Map<String, Integer> hashMap = new HashMap<>(); // 添加元素 hashMap.put("apple", 1); hashMap.put("banana", 2); // 获取元素 Integer value = hashMap.get("apple"); // 遍历key值集合 for (String key : hashMap.keySet()) { Integer val = hashMap.get(key); System.out.println(key + ":" + val); } // 遍历value值集合 for (Integer val : hashMap.values()) { System.out.println(val); } // 遍历键值对集合 for (Map.Entry<String, Integer> entry : hashMap.entrySet()) { String key = entry.getKey(); Integer val = entry.getValue(); System.out.println(key + ":" + val); } // 删除元素 Integer val = hashMap.remove("apple"); } }