当我们让2个对象的hashcode指向一个地址时,为什么它是临时的?
When we make hashcode of 2 objects to point to one address,why it is temporary?
这里Equals_to_operator
是一个Class并且有一个参数化的构造函数public Equals_to_operator(int dd, int mm, int yy)
。
e
和 f
是两个对象,它们使用相同的参数调用参数化构造函数。
我已经覆盖了 hashCode
并使两个对象的 hashCode 相同。
尽管使哈希码相同(对象的内存位置相同),但它给出 Output:not 等于
我想通过使哈希码相同来执行相同的操作,我哪里出错了?
public class Equals_to_operator {
private int dd,mm,yy;
public Equals_to_operator(int dd, int mm, int yy) {
this.dd = dd;
this.mm = mm;
this.yy = yy;
}
@Override
public String toString() {
return "Equals_to_operator [dd=" + dd + ", mm=" + mm + ", yy=" + yy + "]";
}
public int hashCode() {
return 1;
}
public static void main(String[] args) {
Equals_to_operator e=new Equals_to_operator(7, 1, 2016);
System.out.println(e+"\n"+e.hashCode());
Equals_to_operator f=new Equals_to_operator(7, 1, 2016);
System.out.println(f+"\n"+f.hashCode());
if (e==f)
System.out.println("equals");
else
System.out.println("not equals");
}
== // checks equality in terms of memory address
something.equals(somethingElse) // enforces your own terms of what "equals" is if. If you wish to do this, override "equals()"
hashCode() // used when you're trying to use a collection such as a hashmap to map a key object to a value
您可能应该查看这些项目的文档,但您确实需要了解 == 和 .equals() 之间的区别。
编辑:旁注:如果当你更深入地研究 hashCode() 时,你在某处读到默认情况下对象的 toString() 表示(没有覆盖 toString())是一种内存形式地址,这是一个常见的误解。它实际上是 hashCode-- 但我离题了。
您似乎对 equals
和 hashCode
的交互方式存在根本性的误解。这两种方法协同工作,不能相互替代。此外,您似乎误解了这两种方法与运算符 ==
交互的方式:它们没有;运算符 ==
检查对象身份,因此在您的程序中它会 return false
即使您正确地覆盖 hashCode
和 equals
.
您必须始终成对重写这两个方法,并调用 equals
来检查相等性。
返回相同的散列码告诉基于散列的容器您的对象可能相等,从而触发对equals
的额外调用; return 不同的哈希码允许哈希容器跳过对 equals
.
的调用
Eventhough making the hashcode same(memory location of object same) it gives Output:not equals
具有相同的哈希码并不意味着对象是相等的。
memory location of object same
... 这不是哈希码的作用。你从哪里得到的?
if (e==f)
这意味着如果 e
和 f
都指向同一个对象,则条件为真。
根据您的 equals
方法,e
和 f
指向的对象都相等,但 ==
但检查引用相等性而不是内容。
这里Equals_to_operator
是一个Class并且有一个参数化的构造函数public Equals_to_operator(int dd, int mm, int yy)
。
e
和 f
是两个对象,它们使用相同的参数调用参数化构造函数。
我已经覆盖了 hashCode
并使两个对象的 hashCode 相同。
尽管使哈希码相同(对象的内存位置相同),但它给出 Output:not 等于
我想通过使哈希码相同来执行相同的操作,我哪里出错了?
public class Equals_to_operator {
private int dd,mm,yy;
public Equals_to_operator(int dd, int mm, int yy) {
this.dd = dd;
this.mm = mm;
this.yy = yy;
}
@Override
public String toString() {
return "Equals_to_operator [dd=" + dd + ", mm=" + mm + ", yy=" + yy + "]";
}
public int hashCode() {
return 1;
}
public static void main(String[] args) {
Equals_to_operator e=new Equals_to_operator(7, 1, 2016);
System.out.println(e+"\n"+e.hashCode());
Equals_to_operator f=new Equals_to_operator(7, 1, 2016);
System.out.println(f+"\n"+f.hashCode());
if (e==f)
System.out.println("equals");
else
System.out.println("not equals");
}
== // checks equality in terms of memory address
something.equals(somethingElse) // enforces your own terms of what "equals" is if. If you wish to do this, override "equals()"
hashCode() // used when you're trying to use a collection such as a hashmap to map a key object to a value
您可能应该查看这些项目的文档,但您确实需要了解 == 和 .equals() 之间的区别。
编辑:旁注:如果当你更深入地研究 hashCode() 时,你在某处读到默认情况下对象的 toString() 表示(没有覆盖 toString())是一种内存形式地址,这是一个常见的误解。它实际上是 hashCode-- 但我离题了。
您似乎对 equals
和 hashCode
的交互方式存在根本性的误解。这两种方法协同工作,不能相互替代。此外,您似乎误解了这两种方法与运算符 ==
交互的方式:它们没有;运算符 ==
检查对象身份,因此在您的程序中它会 return false
即使您正确地覆盖 hashCode
和 equals
.
您必须始终成对重写这两个方法,并调用 equals
来检查相等性。
返回相同的散列码告诉基于散列的容器您的对象可能相等,从而触发对equals
的额外调用; return 不同的哈希码允许哈希容器跳过对 equals
.
Eventhough making the hashcode same(memory location of object same) it gives Output:not equals
具有相同的哈希码并不意味着对象是相等的。
memory location of object same
... 这不是哈希码的作用。你从哪里得到的?
if (e==f)
这意味着如果 e
和 f
都指向同一个对象,则条件为真。
根据您的 equals
方法,e
和 f
指向的对象都相等,但 ==
但检查引用相等性而不是内容。