java - equals - java中的对称合约似乎出现了问题

标签 java equals

我正在测试Effective Java第二版书中提到的对象Equals方法的对称契约。

Symmetric: For any non-null reference values x and y, x.equals(y) must return true if and only if y.equals(x) returns true.

你能解释一下吗 - 为什么在下面的代码中 list.contains(s) 仍然返回 false。

public final class CaseInsensitiveString {
    private final String s;

    public CaseInsensitiveString(String s) {
        if (s == null)
            throw new NullPointerException();
        this.s = s;
    }

    // Broken - violates symmetry!
    /*
     * @Override public boolean equals(Object o) {
     *  if (o instanceof  CaseInsensitiveString)
     *   return s.equalsIgnoreCase(((CaseInsensitiveString) o).s); 
     *   if (o instanceof String) // One-way  interoperability
     *    return s.equalsIgnoreCase((String) o); return false; 
     *    }
     */

    @Override
    public boolean equals(Object o) {
        return o instanceof CaseInsensitiveString
                && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
    }

    public int hashcode() {
        return 0;
    }

    public static void main(String[] args) {

        CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
        String s = "polish";
        // System.out.println(cis.equals(s));
        // System.out.println(s.equals(cis));
        List<CaseInsensitiveString> list = new ArrayList<CaseInsensitiveString>();
        list.add(cis);
        System.out.println(list.contains(s));
    }

}

最佳答案

该列表包含 CaseInsensitiveString 的单个实例。 s是一个 String 实例,不能等于任何 CaseInsensitiveStringo instanceof CaseInsensitiveString出现在equals中方法将返回 false .

如果您使用 CaseInsensitiveString 的两个实例测试代码由在不同情况下包含相同值的字符串构造,您会看到 contains调用将返回 true :

CaseInsensitiveString titleCase = new CaseInsensitiveString("Polish");
CaseInsensitiveString lowerCase = new CaseInsensitiveString("polish"); // Here!
List<CaseInsensitiveString> list = new ArrayList<CaseInsensitiveString>();
list.add(titleCase);
System.out.println(list.contains(lowerCase)); // prints true

关于java - equals - java中的对称合约似乎出现了问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31019975/

相关文章:

iPhone - 比较一个 nil NSString 与另一个有值(value)的 NSString 返回 NSOrderedSame

c# - C# 中的字典类 - 两个对象的相等性

java - 使用 Spring Task Scheduler 时无法 Autowiring DAO

JavaFX检测场景外的鼠标移动

java - 如果它不是 spring MVC 中的 bean,如何验证请求参数?

java - equals() 方法的工作原理

java - 如何从列表中删除对象

java - 将 post 参数映射到请求中的 DTO

java - 如何使用 JavaMail API 在电子邮件中嵌入电子邮件中附加文件的链接?

java - 添加 equals() 和 hashCode() 方法会破坏某些东西吗