HashSet
参考:Java HashSet | 菜鸟教程 (runoob.com)
- HashSet是Java中的一个重要类,基于HashMap实现,是一个不允许有重复元素的集合。
1.HashSet的主要知识点
- 不重复性
HeshSet不允许插入重复的元素,如果尝试插入一个已经存在的元素,HashSet将会忽略这个插入操作,并且集合的大小不会改变。 - 基于哈希表
- HashSet基于哈希表,它使用HashCode来确定元素在哈希表中的位置。
- 当插入一个新元素时,HashSet会先计算该元素的哈希码,根据哈希码和哈希表大大小确定元素在哈希表中的索引位置。
- 如果两个元素的哈希码相同,但是它们的内容不相等,则将它们视为不同的元素,并分别存储在不同的哈希桶中。
- 元素顺序
HashSet不保证元素的顺序。遍历HashSet时元素可能会以插入顺序不同的顺序出现。 - 线程不安全性
HashSet不是线程安全的。如果在多线程环境下使用HashSet,并且至少有一个线程修改了集合,那么必须在外部进行同步。 - 迭代
可以使用Iterato或增强for循环(for-each loop)来遍历HashSet中的元素。 - 性能
HashSet的查找、添加、删除的平均时间复杂度都是O(1),在哈希冲突较多的情况下可能退化为O(n)。 - 自定义对象的存储
- 在HashSet中存储自定义对象,需要重写对象的hashCode()和equals()方法以确保对象的正确性和唯一性。
- hashCode()方法返回一个整数。如果两个对象在逻辑上是相等的(即equals()方法返回true),那么它们具有相同的哈希码。
2.添加元素:add()
public static void main(String[] args) {
HashSet<String> sites = new HashSet<>();
sites.add("AAA");
sites.add("BBB");
sites.add("CCC");
sites.add("DDD");
sites.add("AAA"); //重复元素不会被添加
System.out.println(sites.add("EEE")); //添加成功返回true,否则为 false
System.out.println(sites);
}
运行结果:
[AAA, CCC, BBB, DDD, EEE]
true
3.判断元素是否存在:contains()
//判断元素是否存在,存在返回 true,否则为 false
System.out.println(sites.contains("AAA"));
4.删除元素:remove()
//删除标记元素,删除成功返回 true,否则为 false
System.out.println(sites.remove("DDD"));
5.清除所有元素:clear()
sites.clear(); //清楚所有元素
6.计算大小:size()
sites.add("AAA");
sites.add("BBB");
sites.add("CCC");
sites.add("DDD");
sites.add("AAA");
System.out.println(sites.size()); //计算大小
运行结果:
4
7.迭代HashSet
public static void main(String[] args) {
HashSet<String> sites = new HashSet<>();
sites.add("AAA");
sites.add("BBB");
sites.add("CCC");
sites.add("DDD");
for(String str : sites){
System.out.println(str);
}
}
运行结果:
AAA
CCC
BBB
DDD