(总结)Java集合_2.Map&Set
类继承结构:
Map
详见:
由于数组长度要求是 2^n ,每次扩容都是原数组的 length<<1,每次新的 length 都是(1000……这种形式)所以和 (length-1) (01111……相对于扩容之前多了一个 1 )进行 & 运算的时候,只有最高位会发生变化,因此只需把高位发生变化的移动即可,通过key的hash值直接对old capacity进行按位与&操作,hash & old capacity ,如果结果等于0,那么不需要移动,反之需要进行移动并且移动的位置等于old capacity + 当前index。新增的1bit是0还是1可以认为是随机的,因此resize的过程,均匀的把之前的冲突的节点分散到新的bucket了
Set
Set集合是继承Collection的接口,是一个不包含重复元素的集合
实现类有三个:
-
HashSet():底层为HashMap()实现, 实际上就是利用map的key-value键值对的方式,通过key的唯一的特性,主要将set构建的对象放入key中,以这样的方式来使用集合的遍历一些特性,从而可以直接用Set来进行调用。源码:
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); } public boolean add(E e) { return map.put(e, PRESENT)==null; /** * 使用HashMap中put(K key, V value); * public V put(K key, V value) { * return putVal(hash(key), key, value, false, true); * } */ } public boolean remove(Object o) { return map.remove(o)==PRESENT; /** * 使用HashMap中remove(Object key) * public V remove(Object key) { * Node<K,V> e; * return (e = removeNode(hash(key), key, null, false, true)) == null ? * null : e.value; * } */ }
-
LinkedHashSet:底层为LinkedHashMap()实现;
-
TreeSet:底层为TreeMap()实现;