HashSet
- 扩展 AbstractSet 并实现 Set 接口,创建一个使用 散列表(哈希表)存储的类集,而散列表通过被称作散列法的机制来存储信息;
- 存储的元素是不可重复的,并且元素都是无序的(即存取顺序不能保证不一致);
- 散列法:一个关键字的信息内容被用来确定唯一的一个值,称为散列码(hashCode),散列码被用来当做与关键字相连的数据的存储下标,关键字到其散列码是自动执行的,因此看不到散列码本身,代码也不能直接索引散列表,大的集合也能使 add(),contains(),remove(),size() 等方法的运行时间不变;
- HashSet 调用元素时会调用 hashCode() 方法,获得其哈希码(hashCode),根据哈希码确定在集合中的存储位置,提高了存储速度;
- HashSet 不能确定元素的排列顺序,通常无法干预排列集合的创建,如果要排序,建议使用 TreeSet;
- java.util.HashSet,详见:Class HashSet;
1. 构造方法
构造方法 | 说明 |
---|
HashSet() | 构造一个空的 Set 集合 |
HashSet(Collection c) | 构造一个包含指定集合的元素的集合 |
HashSet(int capacity) | 构造一个指定初始容量的 Set 集合 |
HashSet(int capacity, float fillRatio) | 指定容量与填充比(又称加载容量,负载因子),填充比必须介于 0.0 与 1.0 之间,决定散列集合向上调整大小之前有多少被填满,当元素个数大于 散列表容量 x 填充比 时,散列集合被扩大,默认值是 0.75 |
2. 去除重复元素的原理
- HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存储和查找性能。保证元素唯一性的方式依赖于:hashCode() 与 equals() 方法;
- 下图是原理简析,详见:Java 哈希表;
![HashSet去重原理](https://i-blog.csdnimg.cn/blog_migrate/546707272775eb14252a44d289592d16.jpeg)
3. 类的使用
import java.util.HashSet;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
hs.add("12");
hs.add("34");
hs.add("56");
hs.add("12");
System.out.println(hs.size());
Iterator it = hs.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println();
for (String name : hs) {
System.out.print(name + " ");
}
}
}
4. 源码分析
5. 应用