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);
}