1. equals方法本身会先用==来判断对象的地址是否相同,如果对象的地址相同就返回true。如果==判断两个对象的地址不同,就会继续比较两个字符串的值是否相等,如果相等就返回true(这里引出一下自己学习中的见解,也是方便自己复习)
“在默认方法中equals继承父类Object类,方法和==相同,在对字符串进行比较时会自动重写equals方法。如果想判断自定义的属性,例如年龄等一般需要重写tostring()方法,判断年龄是否相等”。
2. 在java中,几乎所有的对象都继承Object类,Object包含了hasCode方法,所以几乎所有对象都有hasCode方法返回对应的哈希值,在往哈希表(HasMap)(HasSet)存储数据时,会先对两个对象的哈希值取模运算判断是否相同(因为哈希表的大小是有限的,所以会出现即使不是同一个对象,但是哈希值却是相同的,这就需要更强力的equals来比较元素是否相同,哈希冲突),这样做的目的降低了equals的使用次数,增强了效率(为什么hasCode的效率比equals强,因为hasCode方法计算的是对象的返回值,而equals会去比较对象的内容 ,如果包含多属性和递归就更复杂)equals来判断两个对象的值是否相同,如果相同就覆盖,如果不同就散列到哈希表的其他位置。
举个例子 比如我有一个对象1名字叫Tom,对象2也叫Tom,明明我的equals重写过了是相同的,但是在往哈希表存数据的时候,还是无法去重,除非我把hasCode也重写了,让他名字相等就哈希值相等。
现在来简短的回答一下问题,如果x.equals(y)==true,那么他们的对象肯定是同一个,并且hasCode的值必然相同。
可是如果只重写了equals方法就会导致x.equals(y)成立但是hasCode的值不相同,就会导致一个相同的对象被存入到表中