此处Equals_to_operator
是一个类,并且具有参数化构造函数public Equals_to_operator(int dd, int mm, int yy)
。
e
和f
是两个对象,它使用相同的参数调用参数化构造函数。
我已经覆盖hashCode
并使对象的hashCode相同。
尽管使哈希码相同(对象的内存位置相同),但它给出了输出:不等于
我想通过使hashcode相同来执行相同的操作,我出错了?
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");
}
答案 0 :(得分:2)
您似乎对equals
和hashCode
互动的方式存在根本性的误解。这两种方法协同工作,而不是相互替代。而且,你似乎误解了这两种方法与运算符==
的交互方式:它们没有; operator ==
检查对象标识,因此在您的程序中,即使您正确覆盖false
和hashCode
,它也会返回equals
。
您必须始终成对覆盖这两个方法,并调用equals
来检查相等性。
返回相同的哈希码会告诉基于哈希的容器您的对象可能相等,从而触发对equals
的额外调用;返回不同的哈希码允许哈希容器跳过对equals
的调用。
答案 1 :(得分:1)
== // 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(),那么您在某处读取了默认情况下Object的toString()表示(没有覆盖toString())是内存地址的一种形式,这是一种常见的误解。它实际上是hashCode - 但我离题了。
答案 2 :(得分:1)
尽管使哈希码相同(对象的内存位置相同),但它给出了输出:不等于
具有相同的哈希码并不意味着对象是相等的。
memory location of object same
...这不是哈希码的作用。从那里你得到了什么?
if(e == f)
如果e
和f
都指向同一个对象,则表示条件为真。
根据您的equals
方法,e
和f
指向的对象都相同但==
但检查引用相等而不是内容。