有人可以解释一下这个hashcode()合约中的应用实际意味着什么?

时间:2012-07-18 07:40:40

标签: java jls

来自JLS:

  

每次在执行期间多次在同一对象上调用它   对于一个应用程序,hashCode方法必须始终返回   相同的整数,没有提供等于比较的信息   对象被修改。从一次执行开始,该整数不需要保持一致   应用程序的另一个执行相同的应用程序。

这里的术语应用程序是什么意思以及为什么允许对象的hashcode()在同一个应用程序的不同执行之间变化?

6 个答案:

答案 0 :(得分:5)

Application是您的Java程序。

它可能因不同的应用程序实例而异,因为默认情况下(Object的哈希码)基于对象的地址。

答案 1 :(得分:2)

  

这里的申请是什么意思

听起来很简单,这里没有技巧。

  

为什么允许hashcode()在同一个应用程序的不同执行之间变化?

哈希集合仅在内存中,并在应用程序重新启动时重新构建。这意味着它每次构建时都可以有不同的实现。 (它不能改变现有的集合)

答案 2 :(得分:1)

hashCode方法由各种java类使用。例如,HashMap使用hashCode来有效地存储和检索密钥。

为了给出可靠的结果,hashCode的合同按原样说明。例如。如果在运行应用程序期间HashMap中使用的对象的hashCode不相同,则HashMap将无法一致地检索密钥。

因此,这里的应用程序意味着您的Java程序的运行实例。如果如果程序停止并再次启动,hashCode将返回不同的值,我会没事的。

答案 3 :(得分:0)

应用程序意味着您的Java程序。 hashcode可能因程序的不同实例而异,但不在同一实例中。

有关hashCode的详情,请参阅

答案 4 :(得分:0)

hashcode()的目的是创建一个对象的哈希码,以便它可以存储在哈希集,哈希映射等中。 hashcode()的目的是比较不同的对象(那是什么(等于())。

对于几次运行的JVM,hashcode()根本不需要产生相同的结果。虽然大多数java对象总是为实例的相同状态返回相同的哈希码,但是你永远不应该依赖它。

您还应注意,如果您在课程中覆盖equals(),则还应覆盖hashcode()

  

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object

答案 5 :(得分:0)

举个例子:

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()方法实现)。

这是剩余陈述的含义:

  

这个整数不需要一次执行就保持一致   应用程序到同一个应用程序的另一个执行。