Set之所以会去重,和map有很大的关系。
看源码你会发现HashSet底层使用HashMap存储
TreeSet底层使用TreeMap存储
LinkedHashSet底层使用LinkedHashMap存储
拿HashSet为例子,我们查看add()方法的源码
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
return的map对象其实是 一个HashMap
private transient HashMap<E,Object> map;
再看map.put(e, PRESENT)
被传进来的泛型对象当成了Map的键,因为Map键值重复的话新的键会覆盖旧的键值,所以Set不会重复。