Bloch的精彩书籍“Effective Java”指出,如果equals不对称,那么Collections包含的行为是不确定的.
在他给出的例子中(通过下面的小修改再现),布洛赫说他看到了“假”,但也可以看到真实或异常.
如果标准没有指定contains(Object o)是否检查集合中每个项目的e.equals(o)或o.equals(e),并且实现前者,则可以看到“true”.然而,Collections Javadoc清楚地表明它必须是后者(这是我观察到的).
所以我看到的唯一可能性是“假”或可能是例外(但String Javadoc似乎排除了后者).
我理解更广泛的观点,非对称等于可能会导致集合之外的代码出现问题,但我不会在他引用的例子中看到它.
我错过了什么吗?
import java.util.List;
import java.util.ArrayList;
class CIString {
private final String s;
public CIString(String s) {
this.s = s;
}
@Override public boolean equals( Object o ) {
System.out.println("Calling CIString.equals from " + this.s );
if ( o instanceof CIString)
return s.equalsIgnoreCase( ( (CIString) o).s);
if ( o instanceof String)
return s.equalsIgnoreCase( (String) o );
return false;
}
// Always override hashCode when you override equals
// This is an awful hash function (everything collides -> performance is terrible!)
// but it is semantically sound. See Item 10 from Effective Java for more details.
@Override public int hashCode() { return 42; }
}
public class CIS {
public static void main(String[] args) {
CIString a = new CIString("Polish");
String s = "polish";
List