JDK 8 Class HashSet<E> Doc:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable
1、实现了java.util.Set接口,内部由java.util.Map示例实现(允许null值)
2、不保证迭代顺序,也不保证迭代顺序一直不变
3、非同步;必须从外部同步,比如:Set s = Collections.synchronizedSet(new HashSet());
4、iterator()返回的iterator是fail-fast的:如果这个iterator创建以后,这个set被修改了(不是这个iterator的remove()方法修改的),那么会抛出ConcurrentModificationException异常。(注意,这个fail-fast也是无法保证的,因为在非同步的并发修改中,没有什么是可以保证的)
UML Class Diagram:
HashSet 内部有一个变量:
1 private transient HashMap<E,Object> map;
HashSet 的所有操作最后都是委托给了这个 hashmap。
1、添加元素
1 public boolean add(E e) { 2 // 到 map 中查找,key==e && value==PRESENT 3 return map.put(e, PRESENT)==null; 4 }
2、删除元素
1 public boolean remove(Object o) { 2 // 从 map 中删除 key==o 的元素,其中 key==o 对应的 value==PRESENT 3 return map.remove(o)==PRESENT; 4 }
3、查找元素
1 public boolean contains(Object o) { 2 // 到 map 中查找,key==o 3 return map.containsKey(o); 4 }
常见操作:
Operations | Time Complexity | Notes |
add, remove, contains, size | O(1) | assuming the hash functions has dispersed the elements properly among the buckets |
iteration | proportional to the number of the elememts and buckets | do not set the initial capacity too high(or the load factor too low) for the iteration-critical program |
- Implementing the java.util.Set interface, internally backed by a java.util.HashMap instance(permitting null values).
- Making no guarantees to the iteration order and the constantness of the order over time either.
- Not synchronized; must be synchronized externally, for example: Set s = Collections.synchronizedSet(new HashSet());
- Iterators returned by the iterator() method are fail-fast: it will throw a ConcurrentModificationException if the set is modified after the creation of the iterator and by any method except through the iterator's remove() method. Notice that the fail-fast behavior cannot be guaranteed because nothing can be guaranteed in the presence of unsynchronized concurrent modification.