Java HashSet 详解 - TongtongLan/Java GitHub Wiki
这个类实现了Set接口,由一个哈希表(实际上是一个HashMap实例)支持。对集合的迭代次序没有保证;特别是不能保证订单会随着时间的推移而保持不变。这个类允许null元素。
这个类为基本操作(添加,删除,包含和大小)提供了恒定的时间性能,假设散列函数在桶之间正确地分散元素。遍历这个集合需要的时间与HashSet实例的大小(元素数量)加上支持HashMap实例的“容量”(桶的数量)的总和成正比。因此,如果迭代性能很重要,不要将初始容量设置得太高(或者负载因子太低)。
请注意,此实现不同步。如果多个线程同时访问哈希集合,并且至少有一个线程修改了集合,则必须在外部进行同步。这通常是通过对一些自然封装集合的对象进行同步来完成的。如果不存在这样的对象,则应该使用Collections.synchronizedSet方法来“包装”该集合。这最好在创建时完成,以防止意外的不同步访问集合:
Set s = Collections.synchronizedSet(new HashSet(...));
这个类的迭代器方法返回的迭代器是快速失败的:如果在迭代器创建之后随时修改集合,除了通过迭代器自己的remove方法以外,迭代器会抛出ConcurrentModificationException异常。因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未定的时间冒着任意的,不确定的行为冒险。
请注意,迭代器的故障快速行为无法得到保证,因为一般来说,不可能在存在非同步并发修改的情况下做出任何硬性保证。失败快速迭代器尽最大努力抛出ConcurrentModificationException。因此,编写一个依赖于这个异常的程序是正确的:迭代器的快速失败行为只能用来检测错误。
有四个构造器方法
HashSet()
Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75).
HashSet(Collection<? extends E> c)
Constructs a new set containing the elements in the specified collection.
HashSet(int initialCapacity)
Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75).
HashSet(int initialCapacity, float loadFactor)
Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and the specified load factor.