HashSet

看其源码java.util.HashSet,它的构造函数内部,是使用java.util.HashMap来实现的.

默认的容量大小,以及扩容因子大小分别为:

Initial Capacity16 Load Factor: 0.75

HashSet 实现集合的原理

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

可以看到,它的add的方法里,是通过HashMap的key唯一性来实现的,而内部的HashMapvalue,是一个固定的值private static final Object PRESENT = new Object();

HashMap

看其构造函数,默认容量大小,以及扩容因子大小分别为

Initial Capacity1 << 4,即16 Load Factor0.75

HashMap 中的实体类Node

它实现了Map接口Map.Entry,它代表HashMap中的抽象实体类. 它的属性有

int hash:哈唏码 K key:键 V value:值 Node<K,V> next:下一个map的节点

它的Node的hashCode实现逻辑:

        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }

即key的hashCode 异或 value的hashCode

Node 判断相等

        public final boolean equals(Object o) {
            if (o == this)
                return true;
            if (o instanceof Map.Entry) {
                Map.Entry<?,?> e = (Map.Entry<?,?>)o;
                if (Objects.equals(key, e.getKey()) &&
                    Objects.equals(value, e.getValue()))
                    return true;
            }
            return false;
        }

可以看出,只有同一对象,或者key.equals(key1) 并且 value.equals(value1)才会为真.

Node的 key的 hashCode计算

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }