我理解了equals 和 == 的区别,但是,我想知道 object 类中已经有equals()了,为什么还要自己重写equals (),是不是 object 类中equals() 有什么缺陷呢?
在object类中,默认equals在比较两个对象时,是看他们是否指向同一个地址的。
但有时,我们希望两个对象只要是某些属性相同就认为他们的quals为true。比如:
Student s1 = new Student(1,"name1");
Student s2 = new Student(1,"name1");
如果不重写equals的话,他们是不相同的,所以我们要重些equals,判断只要他们的id和名字相同equals就为true,在一些集合里有时也这样用,集合里的contain也是用equals来比较
主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。
如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。
——而这是反直觉的,因为“我要找的就是那个相等的对象,他明明在,我却找不到”。