浅谈Java的hashcode方法
一些相关概念:
1、散列技术是在记录的存储位置和它的关键字之间建立一个确定的应关系f,使得每个关键字key对应一个存储位置f(key)。查找时根据这个对应关系找到给定值key的映射f(key)。那么这个f成为散列函数,又成为哈希函数。(hash,表面上存key在散列表中的位置)。
2、散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间成为哈希表。
3、散列技术既是存储方法,也是查找方法。
散列技术两大关键:1、散列函数简单、均匀、存储利用率高 2、虽然关键字不同,但有一样的散列函数 ----冲突
优秀博客:httpa://www.cnblogs.com/dolphin0520/p/3681042.html
重要的逻辑关系:因此有人会说,可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判 断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;
如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,则equals方法得到的结果未知。
看源码: JDK1.8 hashcode源码:
static final int hash(Object key) {
int h;
////代表无符号二进制字节右移16位,右移位,不足补0;如果h为-,那么用补码表示
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//其实object的hashcode是本地方法实现的,也就是说Object没有实现,那么 public native int hashCode();
//也就只给出了使用hashcode时,要和equal配合使用的注意事项
//那么,每个类比如String都有自己的hashcode实现方式,而且实现方式都不同!!!!主要是要和equal相配合
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}