1、hashCode()和equals()的作用是什么?
hashCode()和equals()的作用其实是一样的,目的都是为了再java里面比较两个对象是否相等一致
2、hashCode()和equals()的区别是什么?
-
equals()既然已经实现比较两个对象的功能了,为什么还需要hashCode()呢? 因为重写的equals()里一般比较的较为全面和复杂(它会对这个对象内所以成员变量一一进行比较),这样效率很低,而通过hashCode()对比,则只要生成一个hash值就能比较了,效率很高
-
那hashCode的效率这么高,为啥还要用equals()呢? 因为hashCode()并不是完全可靠,非常有可能的情况是,两个完全不同的对象的hash值却是一样的。
-
equals()相等的两个对象他们的hashCode()肯定相等,即equals()绝对可靠
-
hahsCode()相同的两个对象,它们的equals()不一定相同。即用hashCode()比较相同的时候不靠谱
-
hashCode()不同的两个对象,他们的那么equals()肯定不同。即用hashCode()比较不同的时候肯定靠谱
-
3、hashCode()和equals使用的注意事项
-
对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方案为:每当需要比较的时候,首先用hahsCode()去对比,而如果hashCode()不一样,则两个对象肯定不一样,此时就没有必要再用equals()比较了;如果hashCode()相同,则这两个对象有可能相同,这时候再去比较这两个对象的equals(),如若equals()也相同,则表示这两个真的相同的,这样既大大提高了效率,又保证了准确性。
-
事实上,我们平时用的集合框架中的hashMap、hashSet,hashTable 中对key的比较就是使用上述这种方法
-
而Obejct默认的equals和HashCode方法返回的是对象的地址相关信息。所以当我们通过new关键字创建了两个内容相同的对象,虽然他们的内容相同,但是他们在内存中分配的地址不同,导致它们的hashCode()不同,这肯定不是我们想要的。所以当我们要将某个类应用到集合中去的时候,就必须重写equals()方法和hashCode()方法
4、equals、==、hashcode相关的理解
-
在没有重写的情况下equals和==是一样的作用,都是比较内存地址
-
// Object.java public boolean equals(Object obj) { return (this == obj); } Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.、 每当重写hashCode方法时,通常都需要重写该方法
当
==
为true
,hashcode
一定相等当
hashcode
为true
,==
不一定相等,存在hash冲突的情况我们经常使用的
String
比较都是用的equals
,为什么没有比较内存地址,是因为String
底层重写了equals
方法,Integer
同理。// String.java public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }