HashSet
HashSet用于存储无序不重复的元素。
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
由于HashMap的key满足这一特性,故其底层使用HashMap实现。
private transient HashMap<E,Object> map;
public HashSet() {
map = new HashMap<>();
}
其使用要存储的元素为key,使用一个共享元素PRESENT作为value。
具体源码很简单:
private static final Object PRESENT = new Object(); //Value
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
提供迭代器以遍历存储的元素:
public Iterator<E> iterator() {
return map.keySet().iterator();
}
Hashtable
Hashtable与HashMap类似,同样基于哈希算法实现对存储的键值对的快速查询,但其是线程安全的(在方法上使用synchronized关键字),并且未在链表长度过长时将其转化为红黑树。
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
get
首先看看其get方法,与HashSet对比很简单,但有些细节需要注意: