HashSet
HashSet是Set接口的一个实现类,是平时使用较多的一个。Set接口点击打开链接
由于HashSet实现了Set接口,所以HashSet里存储的元素是不能重复的,或者换句话说,HashSet里不能包含两个相同的元素。
集合HashSet是使用HashMap来存储元素的,由于HashMap里存储mapping的key就是不重复的,每个key是唯一的,HashSet刚好使用了HashMap的这一特点,HashSet的元素是存储在HashMap的key里的,而mapping的value都是同一个对象。HashMap点击打开链接
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<E,Object>();
}
其中
HashSet中的每个元素都作为一个key储存在HashMap中,而这个key对应的value都是PRESENT对象,HashMap允许储存相同的value,这是没问题的。由于PRESENT是静态、常量,这样设计也是可以节省空间。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public Iterator<E> iterator() {
return map.keySet().iterator();
}
从以上方法均可以看出HashSet使用了HashMap来对集合的元素进行操作的。