HashSet其实就是HashMap套上了Set的马甲
HashSet内部维护了一个HashMap;
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//略....
}
总结:HashMap的key是不能重复的,而HashSet的元素又是作为map的key,所以HashSet的元素也不会重复了。
例子:
public static void main(String[] args) {
HashSet<String> hs = new HashSet<String>();
hs.add("测");
hs.add("试");
hs.add("去");
hs.add("重");
hs.add("!");
hs.add("!");
hs.add("!");
Iterator<String> it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
打印:
另:HashMap则是依赖HashCode保证key不重复的