jvm中 hashcode

来源:互联网 发布:淘宝店加盟代理 编辑:程序博客网 时间:2024/05/21 08:00

hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同。
而且,还需要注意一下两点:
1)hashCode和equals两个方法是有语义关联的,它们需要满足:
A.equals(B)==true –> A.hashCode()==B.hashCode()
因此重载其中一个方法时也需要将另一个也重载。
2)hashCode的重载实现需要满足不变性,即一个object的hashCode不能前一会是1,过一会就变成2了。hashCode的重载实现最好依赖于对象中的final属性,从而在对象初始化构造后就不再变化。一方面是jvm便于代码优化,可以缓存这个hashCode;另一方面,在使用hashMap或hashSet的场景中,如果使用的key的hashCode会变化,将会导致bug,比如放进去时key.hashCode()=1,等到要取出来时key.hashCode()=2了,就会取不出来原先的数据。这个可以写一个简单的代码自己验证一下。
— 共有 2 条评论 —
方武卓: @xu4v 嗯,对mobile开发不了解,忽略了其他方面的情况,谢谢指正 2年前
xu4v: 未必是地址,主要取决于runtime library的实现,比如Android libcore就没有直接用地址,而是在地址的基础上hack一下 2年前

原创粉丝点击