Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的等对称契约似乎引起了争议_Java_Equals - Fatal编程技术网

java中的等对称契约似乎引起了争议

java中的等对称契约似乎引起了争议,java,equals,Java,Equals,我正在测试有效Java第二版书中提到的对象相等的对称契约方法 对称:对于任何非空参考值x和y,x.equals(y)必须返回 当且仅当y.equals(x)返回true时为true 你能解释一下吗?为什么list.contains在下面的代码中仍然返回false public final class CaseInsensitiveString { private final String s; public CaseInsensitiveString(String s) {

我正在测试有效Java第二版书中提到的对象相等的对称契约方法

对称:对于任何非空参考值x和y,x.equals(y)必须返回 当且仅当y.equals(x)返回true时为true

你能解释一下吗?为什么
list.contains在下面的代码中仍然返回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));
    }

}
public final class CaseInsensitiveString{
私有最终字符串s;
公共案件不敏感预算(字符串s){
如果(s==null)
抛出新的NullPointerException();
这个.s=s;
}
//破坏-破坏对称!
/*
*@覆盖公共布尔等于(对象o){
*if(不区分大小写限制的实例)
*返回s.equalsIgnoreCase(((CaseInsensitiveString)o.s);
*if(o instanceof String)//单向互操作性
*返回s.equalsIgnoreCase((String)o);返回false;
*    }
*/
@凌驾
公共布尔等于(对象o){
返回案例不敏感限制的o实例
&&((对案件不敏感)o.s.equalsIgnoreCase(s);
}
公共int hashcode(){
返回0;
}
公共静态void main(字符串[]args){
CaseInsensitiveString cis=新的CaseInsensitiveString(“波兰”);
字符串s=“波兰”;
//System.out.println(cis.equals(s));
//System.out.println(s.equals(cis));
列表=新的ArrayList();
列表。添加(CI);
System.out.println(list.contains);
}
}

因为
s
是一个
字符串
,所以
o CaseInsensitiveString
实例将返回false。

列表包含一个
CaseInsensitiveString
实例
s
是一个
字符串
实例,它不能等于任何
CaseInsensitiveString
,因为出现在
equals
方法中的
o CaseInsensitiveString
实例将返回
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
CaseInsensitiveString titleCase=新的CaseInsensitiveString(“波兰”);
CaseInsensitiveString lowerCase=新的CaseInsensitiveString(“波兰语”);//在这里
列表=新的ArrayList();
添加(滴定酶);
System.out.println(list.contains(小写));//打印正确

如果不是从
equals
中删除
字符串
比较,而是将其修改为
不区分大小写扩展字符串
?@SMUsamaShah
java.lang.String
最终的
,您不能扩展它。好的,但如果它是可扩展的,它一开始就不会破坏对称性吗?@SMUsamaShah它可能仍然会。考虑下面的代码:<代码> s1=“hello”;s2=新的不区分案件的预算(“你好”)
。在这种情况下,
s1.equals(s2)
将返回
false
,但
s2.equals(s1)
将返回false。