来自 JLS:
每当在应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
这里的应用程序一词是什么意思 ,为什么hashcode()
允许 for on 对象在同一应用程序的不同执行之间有所不同?
应用程序是您的 Java 程序。
它可能因不同的应用程序实例而异,因为默认情况下(的哈希码Object
)基于对象的地址。
此处的应用一词是什么意思
听起来很简单,这里没有技巧。
为什么 hashcode() 允许在同一应用程序的不同执行之间有所不同?
哈希集合仅在内存中,并在您的应用程序重新启动时重新构建。这意味着它每次构建时都可以有不同的实现。(现有收藏不能更改)
hashCode 方法被各种 java 类使用。例如,HashMap使用 hashCode来有效地存储和检索键。
为了给出可靠的结果,hashCode 的合约按原样说明。例如,如果在应用程序运行期间 HashMap 中使用的对象的 hashCode 不同,则 HashMap 将无法一致地检索密钥。
所以这里的应用程序意味着你的java程序的一个运行实例。如果程序停止并重新启动,hashCode 会返回不同的值,我会很好。
举个例子:
class Employee{
public int id;
public String name;
public Employee(int id,String name){
this.id=id;
this.name=name;
}
public boolean equals(Employee employee){
return (this.id==emplooyee.id && this.name.equals(employee.name))
}
public hashcode(){
return id+name.hashcode();
}
现在假设某个其他类中的以下代码被main
函数调用;
Employee emp = new Employee(1, "Sam");
emp.hashcode();
//some other code with does not modify the contents of `emp`
emp.hashcode();
即使在同一执行emp.hashcode()
期间多次调用,这些对方法的调用也将返回相同的整数。
这就是声明的意思:
每当在应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。
现在当你再次运行程序时说
Employee emp = new Employee(1, "Sam");
这里的 emp.hashcode();
方法可能会或可能不会返回与前一个相同的整数(取决于hashcode()
方法实现)。
这就是剩余语句的含义:
该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
hashcode() 的目的是创建对象的哈希码,以便可以将其存储在哈希集、哈希映射等中。 hashcode() 的目的不是比较不同的对象(这就是 equals() 的用途)。
hashcode() 根本不需要在多次运行 JVM 时始终产生相同的结果。尽管大多数 java 对象总是为实例的相同状态返回相同的哈希码,但您永远不应该依赖它。
您还应该注意,如果您equals()
在一个类中覆盖,您也应该覆盖hashcode()
.
请注意,每当重写该方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object )