一、概念和用途
-
HashSet
:HashSet
是一种集合(Set)实现,用于存储不重复的元素。它基于哈希表数据结构,保证了元素的唯一性,但不保证元素的存储顺序。- 例如,用于存储一组不重复的用户名、存储唯一的订单编号等场景。当你不关心元素的顺序,只需要确保集合中不包含重复元素时,可以使用
HashSet
。
-
HashMap
:HashMap
是一种映射(Map)实现,用于存储键值对(key-value pairs)。它也基于哈希表数据结构,通过键(key)来快速查找对应的值(value)。- 例如,用于存储学生的学号和学生对象的对应关系、存储单词和其出现次数的对应关系等场景。当你需要根据一个特定的键来快速访问对应的值时,可以使用
HashMap
。
二、存储结构
-
HashSet
:- 只存储单个元素,每个元素在集合中是独立存在的,没有与其他元素形成明确的键值对关系。
- 内部使用哈希表和链表(或红黑树,在 Java 8 及以上版本中,当链表长度超过一定阈值时会转换为红黑树)来存储元素,通过计算元素的哈希值来确定元素在哈希表中的存储位置。
-
HashMap
:- 存储键值对,每个键值对由一个键和一个值组成。键和值可以是不同的数据类型,但键必须是唯一的。
- 内部同样使用哈希表和链表(或红黑树)来存储键值对。通过计算键的哈希值来确定键值对在哈希表中的存储位置。
三、方法和操作
-
HashSet
的主要方法:add()
:向集合中添加一个元素。如果集合中已经存在相同的元素,则添加操作失败,方法返回false
。remove()
:从集合中移除一个元素。如果集合中不存在该元素,则移除操作失败,方法返回false
。contains()
:判断集合中是否包含某个元素。如果集合中存在该元素,则方法返回true
,否则返回false
。
-
HashMap
的主要方法:put(key, value)
:向映射中添加一个键值对。如果映射中已经存在相同的键,则会覆盖原来的值。remove(key)
:从映射中移除一个键值对。如果映射中不存在该键,则移除操作失败,方法返回null
。get(key)
:根据键获取对应的值。如果映射中不存在该键,则方法返回null
。
四、遍历方式
HashSet
:- 可以使用迭代器(
Iterator
)进行遍历,也可以使用增强型 for 循环。例如:
- 可以使用迭代器(
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
// 使用迭代器遍历
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 使用增强型 for 循环遍历
for (String element : set) {
System.out.println(element);
}
HashMap
:- 可以遍历键集(
keySet
)、值集(values
)或者键值对集(entrySet
)。例如:
- 可以遍历键集(
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 3);
map.put("cherry", 7);
// 遍历键集
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
// 遍历值集
for (Integer value : map.values()) {
System.out.println(value);
}
// 遍历键值对集
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}