gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:37:46 25 4
gpt4 key购买 nike

我正在测试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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com