Java对重写equals方法有一些约定,其中一条就是要求对称性,即ab返回true,ba也要返回true。下面的例子就是重写所范的错误。
代码:

public final class CaseInsensitiveString {
    private final String s;

    public CaseInsensitiveString(String s) {
        this.s =  s.requireNonNull(s);
    }

    @Override
    public boolean equals(  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方法对大小写方法敏感造成不对称。
收藏 打印