Java HashSet HashMap 原理
Contents
HashSet
看其源码java.util.HashSet
,它的构造函数内部,是使用java.util.HashMap
来实现的.
默认的容量大小,以及扩容因子大小分别为:
Initial Capacity
: 16
Load Factor
: 0.75
HashSet 实现集合的原理
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
可以看到,它的add的方法里,是通过HashMap
的key唯一性来实现的,而内部的HashMap
的value
,是一个固定的值private static final Object PRESENT = new Object();
HashMap
看其构造函数,默认容量大小,以及扩容因子大小分别为
Initial Capacity
:1 << 4
,即16
Load Factor
: 0.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);
}