Java对重写equals方法有一些约定,其中一条就是要求对称性,即ab返回true,ba也要返回true。下面的例子就是重写所范的错误。
代码:
public final class CaseInsensitiveString {
private final String s;
public CaseInsensitiveString(String s) {
this.s = Objects.requireNonNull(s);
}
@Override
public boolean equals(Object obj) {
if(obj instanceof CaseInsensitiveString) {
return s.equalsIgnoreCase(((CaseInsensitiveString) obj).s);
}
if(obj instanceof String) {
return s.equalsIgnoreCase(((String)obj));
}
return false;
}
}
public class Test {
public static void main(String[] args) {
CaseInsensitiveString cis=new CaseInsensitiveString("Polish");
String s="polish";
System.out.println(cis.equals(s));//true
System.out.println(s.equals(cis));//false
}
}
测试结果
true
false
结论
CaseInsensitiveString 的equals方法对大小写不敏感,String的equals方法对大小写方法敏感造成不对称。
附:
原文连接已不记得了,如有侵权请联系我删除。