java.lang.Object-hashCode()方法介绍

源码介绍

Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by java.util.HashMap.

The general contract of hashCode is:

  • Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
  • It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

译文

返回对象的哈希值。

这个方法被用来支持哈希表,比如HashMap类里提供的哈希表。

hashCode方法的一般约束:

1、在对象的equals方法比较中所用的信息没有被修改的前提下,应用程序执行期间,在同一对象上多次调用 hashCode方法时,必须一致地返回相同的整数。同一应用程序多次执行时,该整数无需保持一致。 
2、如果根据equals方法,两个对象是相等的,那么在两个对象中的每个对象上调用hashCode方法都必须生成相同的整数。
3、如果根据equals方法,两个对象是不相等的,那么在两个对象中的每个对象上调用hashCode方法没有要求必须生成不相同的整数。但是如果此时生成的是不相同的整数,会提高哈希表的查找性能。

hashCode()方法的作用是什么

hashCode()方法和equals()方法都是用来对比两个对象是否相等。还有一个作用是可以提高集合类型的存储和查找效率。

equals方法和hashCode方法区别

1、equals方法可以被重写,如果重写的比较复杂,则效率就比较低,而hashCode方法,只要生成一个hash值就可以进行比较,效率高

2、hashCode不是完全可靠,有时候不同的对象他们生成的hashCode也会一样(取决于hashCode方法的具体实现,因为hashCode方法也可以被重写)

Object类中的hashCode()方法返回对象在内存中地址转换成的一个int值,所以如果没有重写hashCode()方法,任何对象的hashCode()方法都是不相等的。

3、在实际应用中,如果我们不会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,不会创建该类的HashSet集合。这种情况下,equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用,所以,不用理会hashCode()。

hashCode方法主要是用来支撑集合类

4、在实际应用中,如果我们会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,会创建该类的HashSet集合。
在这种情况下,该类的“hashCode() 和 equals() ”是有关系的:

举个实际的例子Set:

我们知道Set里面的元素是不可以重复的,那么如何做到?

Set是根据equals()方法来判断两个元素是否相等的。

比方说Set里面已经有1000个元素了,那么第1001个元素进来的时候,最多可能调用1000次equals方法,如果equals方法写得复杂,对比的东西特别多,那么效率会大大降低。

使用HashCode就不一样了,比方说HashSet,底层是基于HashMap实现的,先通过HashCode取一个模,这样一下子就固定到某个位置了,如果这个位置上没有元素,那么就可以肯定HashSet中必定没有和新添加的元素equals的元素,就可以直接存放了,都不需要比较;

如果这个位置上有元素了,逐一比较,比较的时候先比较HashCode,HashCode都不同接下去都不用比了,肯定不一样,HashCode相等,再equals比较,没有相同的元素就存,有相同的元素就不存。

如果原来的Set里面有相同的元素,只要HashCode的生成方式定义得好(不重复),不管Set里面原来有多少元素,只需要执行一次的equals就可以了。这样一来,实际调用equals方法的次数大大降低,提高了效率。

如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写

参考

如果对象的equals方法重写了,为什么要求hashCode方法也重写

hashCode和equals方法的区别

 

 

 

 

上一篇:java String为什么一定要重写hashcode


下一篇:Java hashCode() 和 equals()的常问问题解答