Java的HashMap与HashSet全面笔记:实践应用
Java的HashMap和HashSet是集合框架中常用的数据结构,理解它们的特性和使用场景是非常重要的。下面是关于HashMap和HashSet的全面笔记,包括原理、用法、以及实践应用。
HashMap
基本概念
- 定义:HashMap是一个基于哈希表实现的Map接口,允许存储键值对。它是无序的,可以包含一个空键和多个空值。
- 结构:HashMap内部是基于数组和链表(或红黑树,Java 8以后)的结构来实现的。
- 特点:
- Key是唯一的,可以为null。
- 插入和查找的性能平均是O(1)(如果哈希冲突较多,可能会退化到O(n))。
常用方法
put(K key, V value)
: 添加或更新键值对。get(Object key)
: 根据键获取值,如果不存在返回null。remove(Object key)
: 删除键值对,返回被删除的值。containsKey(Object key)
: 检查HashMap中是否包含指定的键。containsValue(Object value)
: 检查HashMap中是否包含指定的值。keySet()
: 获取所有键的Set视图。values()
: 获取所有值的Collection视图。entrySet()
: 获取键值对的Set视图。
实践应用
- 缓存:可以用HashMap来实现简单的缓存机制,存储大量的数据对象以便快速检索。
- 计数器:可以使用HashMap来统计元素频率,比如统计字符串中每个字符出现的次数。
Map<Character, Integer> charCount = new HashMap<>();
for (char c : input.toCharArray()) {
charCount.put(c, charCount.getOrDefault(c, 0) + 1);
}
HashSet
基本概念
- 定义:HashSet是一个不重复的元素集合,基于HashMap来实现。
- 结构:HashSet的底层由一个HashMap支持,所有的元素都作为HashMap的键对象存储,值为一个固定对象。
- 特点:
- 元素是唯一的(不允许重复)。
- 不保证集合的顺序。
- 可以包含一个null元素。
常用方法
add(E e)
: 向集合中添加元素,返回是否添加成功。remove(Object o)
: 从集合中删除元素。contains(Object o)
: 检查集合中是否包含指定元素。size()
: 返回集合中元素的数量。isEmpty()
: 检查集合是否为空。clear()
: 清空集合的所有元素。
实践应用
- 去重:HashSet常用于去重场景,比如列表中去除重复的元素。
- 集合运算:HashSet的交集、并集、差集运算对解决集合问题很有帮助。
Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
Set<Integer> set2 = new HashSet<>();
set2.add(2);
set2.add(3);
// 交集
set1.retainAll(set2); // set1变为 [2]
// 并集
set1.addAll(set2); // set1变为 [1, 2, 3]
// 差集
set1.removeAll(set2); // set1变为 [1]
效率和注意事项
- 装载因子:HashMap的默认装载因子是0.75,这代表当一个HashMap填满75%时,它会扩容为之前的2倍。
- 初始容量:如果能估计到存储的元素数量,最好在初始化HashMap和HashSet时指定初始容量,以减少不必要的扩容。
- 线程安全:HashMap和HashSet是非线程安全的,若在多线程环境下使用,需用Collections.synchronizedMap()或使用ConcurrentHashMap。
通过理解和运用这些基本特性和方法,你可以更有效地使用Java的HashMap和HashSet来解决实际开发中的问题。