Java中每种类型的hashCode()
计算方式不同,以下是常见类型梳理
Map:每个entry的哈希值的总和
public int hashCode() {
int h = 0;
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext())
h += i.next().hashCode();
return h;
}
内部的Entry<K,V>
计算方式:键的hashcode
^
值的hashcode
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
List:之前元素 * 31 + 当前元素
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}
List是顺序型结构,内部元素顺序不同会使得两个List的hashcode不同
String:和List计算方法差不多
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
其余基本类型:直接返回value
public int hashCode() {
return T.hashCode(value); // 基本类型 extends T
}
文档信息
- 本文作者:L1Chenxv
- 本文链接:https://l1chenxv.github.io//2023/07/04/all-type-hashcode/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)