来自JLS:
每次在执行期间多次在同一对象上调用它 对于一个应用程序,hashCode方法必须始终返回 相同的整数,没有提供等于比较的信息 对象被修改。从一次执行开始,该整数不需要保持一致 应用程序的另一个执行相同的应用程序。
这里的术语应用程序是什么意思以及为什么允许对象的hashcode()
在同一个应用程序的不同执行之间变化?
答案 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()
方法实现)。
这是剩余陈述的含义:
这个整数不需要一次执行就保持一致 应用程序到同一个应用程序的另一个执行。