其余更多java基础文章:
java基础学习(目录)java
Set集合的底层都是使用相对应的Map。HashSet底层是HashMap,LinkedHashSet底层是使用LinkedHashMap,TreeSet底层是使用TreeMap。都相对简单,因此就放在一篇文章里讲解了。只简单讲一下HashSet的源码,由于其余二者大同小异。安全
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
复制代码
显而易见,hashSet的底层和方法就是使用hashmap。Set实现值不重复的原理就是在保存值到底层hashmap里的时候,保存为key值,value值为常量PRESENT。具体能够看下面方法讲解。bash
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//本身初始化容量和加载因子的大小
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//初始化容量大小,加载因子用默认的
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
复制代码
简单的构造方法,就不阐述了。数据结构
//这个方法就能够得知HashSet添加的元素是不可以重复的,缘由是什么呢,set将每次添加的元素度是经过map中的key来保存,当有
//相同的key时,也就是添加了相同的元素,那么map会讲value给覆盖掉,而key仍是原来的key,因此,这就是set不可以重复的缘由。这个方法的PRESENT能够看下面的注释,
//返回值的式子的意思很好理解,map中增长元素是先经过key查找有没有相同的key值,若是有,则覆盖value,返回oldValue。没有
//,则建立一个新的entry,而且返回null值。若是key等于null,也会返回null值。因此return会有一个==null的判断
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
复制代码
//set经过判断删除元素是否为常量PRESENT,来肯定是否成功删除
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
//hashmap中的remove方法
public V remove(Object key) {
Entry<K,V> e = removeEntryForKey(key);
return (e == null ? null : e.value);
}
复制代码