Object类中的equals和hashCode方法
无论何时这个equals方法被重写那么都是有必要去重写hashCode方法,这个是因为为了维持hashCode的一种约定,相同的对象必须要有相同的hashCode值。
--------------------------------------------------------------------------------------------
equals方法的结果为false,那么hashCode方法返回的结果可以相同也可以不相同。
---------------------------------------------------------------------------------------------
hashcode是Object中的函数,所有类都拥有的一个函数,主要返回每个对象的hash值,主要用于哈希表中,如HashMap、HashTable、HashSet。
哈希码的通用约定如下:
在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。
如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等。
如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。
由下图可以看到,hashCode是一个native方法,看不到实现,注解中说hashCode返回的是由对象存储地址转化得到的值,是否如此,可以看源码一探究竟。
先给结论:
java6、7默认是返回随机数
java8默认是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数
源码探索过程可以参考:
https://fangjian0423.github.io/2016/03/12/java-Object-method/参考
https://juejin.im/entry/5968876df265da6c232898c2
https://fangjian0423.github.io/2016/03/12/java-Object-method/---------------------------------------------------------------------------------------------------------------------------------------------
Java Object.hashCode()返回的是对象内存地址?
基于OpenJDK 8
一直以为Java Object.hashCode()的结果就是通过对象的内存地址做相关运算得到的,但是无意在网上看到有相应的意见争论,故抽时间从源码层面验证了剖析了hashCode的默认计算方法。
先说结论:OpenJDK8 默认hashCode的计算方法是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia's xorshift scheme随机数算法得到的一个随机数。和对象内存地址无关。
- ---------------------------------------------------------------------------------------------------------------------------------------------
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。