为什么这个java equals()方法违反了对称实现规则?

时间:2015-02-20 03:30:38

标签: java

以下代码是java equals方法的错误实现。它违反了对称规则。但我不知道它是如何违反这条规则的。请指出它在这种方法中违反对称规则的位置。

public class WrongEquals {

    private final String variable;

    public WrongEquals(String variable) {
            this.variable = variable;
    }

    @override public boolean equals(Object o) {
            if (this == o) {
                    return true;
            }
            if (o instanceof String) {
                    return variable.equals((String) o);
            }
            if (o instanceof WrongEquals) {
                    return variable.equals(((WrongEquals) o).variable);
            }
            return false;
    }

    @override
            public int hashCode() {
                    return (variable == null ? 0 : variable.hashCode());
            }
}

2 个答案:

答案 0 :(得分:8)

因为您的WrongEquals个实例可能等于某个String,但没有String将等于WrongEquals的任何实例

查看String equals()的实现(从JDK 7开始)

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

显然,此实现确保任何相等性仅存在于另一个String实例之间。

答案 1 :(得分:4)

(这只是Kon先前回答的扩展和说明)

尝试添加此主程序:

  public static void main(String[] args){
    WrongEquals a = new WrongEquals("xyzzy");
    String b = "xyzzy";
    System.out.println(a.equals(b));
    System.out.println(b.equals(a));
  }

将显示:

true
false