细致去分析这三者间的关系可以帮助我们更好地理解java语言特性,理解java虚拟机
前置内容:
jvm的运行时结构
哈希算法
1> 首先,“= =”通常用来比较两个基本数据类型是否相同,比较的是它们的栈地址(在jvm的方法区中)
2>我们去看Object类的源码,其实equals的实现就是用“= =”实现的,但是很多类会重写equals方法,导致了使用上的不同。我们以String举例,String的equals方法对比的就是两个对象的”内容“是否相同,对比的是两个对象的哈希码是否相同,对比是堆(java堆)中的内容
3> hashcode()方法对比的是两个对象的哈希码是否相同,而这个哈希码,是用对象在堆中的内容计算出来的,而不是通过地址计算出来的
总结:如果要比较两个对象是否是同一个对象,那么使用“==”,对比的是对象在jvm方法区中的栈地址,如果要比较两个对象的内容是否相同,则使用equals,也正是因此,我们重写一个类的equals时一定要重写hashcode,目的是让重写后的equals方法认定两个对象有相同的哈希值(不论原本是否如此)
PS:为什么要如此麻烦?
java是内存安全的,无法通过散列码获取内存地址,我们做的判断都是基于jvm暴露给程序员的内容