1、== 与equals
“==”:作用是判断两个对象的地址是否相等。
- 当用于基础数据类型(整型、浮点、布尔、char类型)的比较时,比较的是值;
- 当用于引用数据类型(例如String)的比较时,比较的是内存地址。
equals:作用也是判断两个对象是否相等。
- 当类没有覆盖equals方法时,等价于“==”比较两个对象;
- 当类覆盖equals方法时,是判断两个对象的内容是否相等。
补充:
String中的equals方法是被重写过的,因此比较的是对象的值。
当创建String类型的对象时,虚拟机会现在常量池中查找又没有已经存在的值和要创建的对象值相同,有的话就将其赋给引用,没有的话就在常量池中重新创建一个String对象。
2、equals()与hashcode()
参考链接:Java hashCode() 和 equals()的若干问题解答
hashCode()的作用:确定该对象在哈希表中的索引位置。
(并不能唯一确定一个对象,不同对象的哈希值可能是不同的,但是哈希值相同,意味着映射在哈希表中的位置相同)
Q1:为什么equals方法被覆盖,hashCode方法也需要重写?
答:因为有相关规定:如果两个对象相等,那么hashcode也一定相同,且equals也返回true。
Q2:两个对象equals那么他们的hashcode相同吗?
答:相同。
Q3:两个对象hashcode相同,那么他们equals吗?
答:不一定。
首先以上两个问题的答案都必须建立在:两个方法都没有被重写。
规范:
1、hashCode和equals的返回值应该是稳定的,不应该具有随机性;(也就是说,比较多次的结果应该是一样的)
2、两对象返回true那么这两个对象的equals也应该返回true;
3、两对象equals则这两个对象的hashCode应该相等。
补充:
1、默认对象的hashCode方法返回值永远>=0;
2、默认对象的hashCode方法返回值不是对象的地址;
3、关于==,有些存在常量池里的对象有所不同。