在比较两个值是否相等时候一般使用==,而equals比较的是两个Java对象的地址(引用是否相等)。
而在String,Integer等封装类中,这些类的equals方法已经重写,可以说是比较内容了。
返回对象的hashcode值。
为什么覆盖equals方法时总要覆盖hashCode方法?
通用约定:如果两个对象根据equals比较是相等的,那这两个对象调用hashCode方法返回的结果必须是一样的。
如果相同的对象具有不同的hashCode,那么将对象放入hashMap中,对象会被存到其中一个桶中,但当你去get 时,虽然是同一个对象,但是由于生成的hashCode不同,会到不同的桶中去找,此时便找不到那个对象。
初学者可以简单理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
当集合要添加新的元素时,先调用这个元素的hashCode方法得到hash值,hash值通过哈希算法能定位到下标。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就覆盖v值,不相同就将元素添加在链表的末尾。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
Java对象的eqauls方法和hashCode方法是这样规定的: 1、相等(相同)的对象必须具有相等的hash值。 2、如果两个对象的hashCode相同,它们并不一定相同。