java Equals方法

时间:2015-12-22 17:26:03

标签: java reference equals

我正在阅读如何在Java中正确覆盖equals,并遇到了这个示例。我的第一个想法是它会通过反身属性,但显然它没有。

由于这一行基本上返回false:if(this != tc) return true;

但是没有检查相同的实例tc1,所以tc1.equals(tc1),它不会传递引用tc1的副本,这意味着它们都指向同一个TestClass对象,因此这个和tc1实际上是指向同一个对象吗?

class TestClass {
    int someVar;

    TestClass(int i) {
        someVar=i;
    }

    public boolean equals(Object tc) {      
        if (tc instanceof TestClass && this.someVar == ((TestClass) tc).someVar) {
            if (this != tc) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

    public int hashCode() {
        return 1;
    }
}


public class HashDemo {
    public static void main(String []args) {
        TestClass tc1 = new TestClass(20);
        System.out.println(tc1.equals(tc1));
    }    
}

2 个答案:

答案 0 :(得分:3)

我认为你已经转了一些if语句。

此处的常规等于方法看起来像这样。

public boolean equals(Object that){
   if (this == that) {
      return true;
   }

   if (that instanceof TestClass && this.someVar == ((TestClass) that).someVar ) {
     return true;
   }

   return false;
}

答案 1 :(得分:-2)

这显然不是覆盖equals方法的正确方法,但它允许您指出" =="之间的差异。和#34;等于"对象

两个引用之间的平等是用" =="运营商。 equals方法用于通过值测试egality,这就是为什么你可以根据你的功能需要覆盖它。

关于您的代码:

  • tc1 == tc1 - > TRUE
  • tc1.equals(tc1) - > FALSE