前面大概讲了ArrayList和LinkedList,HashMap,现在来讲讲HashSet。因为HashSet是的实现是基于HashMap的,所以放在HashMap的后面写。
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
HashSet的实现是基于HashMap的,自己去看源代码,里面有一个HashMap实例。那么HashSet的值到底是保存在哪里的呢,其实通过HashSet的迭代器就能看出来:
public Iterator<E> iterator() {
return map.keySet().iterator();
}
HashSet迭代元素的时候是调用HashMap的key集合方法,所以由此可见是保存到了HashMap的key位置了,不信看add方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;//PRESENT是一个常量
}
private static final Object PRESENT = new Object();
这也就是为什么HashSet是无序的,并且不允许元素重复。因为HashMap的元素保存是散列,并且key不能重复。HashSet是基于HashMap实现,所以很多特性都和HashMap一样。