HashCode()、equals()的区别
首先说一下 “==”
== 是运算符,用来比较两个值、两个对象的内存地址是否相等;
原始数据类型: byte,short,char,int,long,float,double,boolean它们之间的比较,应该使用==,比较的是他们的值;
引用类型:当它们用==进行比较的时候,比较的是它们在内存中的存放地址。
所以,除非是同一个new出来的对象,它们比较后的结果为true,否则比较后结果为false;
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见==是对栈中的值进行比较的。
若要比较堆中对象的内容是否相同,那么就要重写equals方法了;
equals和hashCode都是Object对象中的非final方法,目的是被用来覆盖(override)的
hashCode()、equals()都定义在JDK的Object.java中;
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置;
equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”;
这里对equals重新覆盖需要注意五点
(1) 自反性:对任意引用值X,x.equals(x)的返回值一定为true.
(2) 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
(3) 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
(4) 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
(5) 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?
因为重写的equal()里一般比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?
因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:
如果两个对象通过equals方法比较相等,那么他的hashCode一定相等;
如果两个对象通过equals方法比较不相等,那么他的hashCode有可能相等;
最后:
若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值;