包含方法的规范说:
当且仅当此集合包含至少一个元素 e 时返回 true,使得 [docs oracle][1](o==null ? e==null : o.equals(e))
但是,它还说,如果集合不允许空元素,它可能会引发 a,或者如果指定元素的类型与此集合不兼容,则可能会引发 a。这些被标记为 。NullPointerException
ClassCastException
optional
此外,它还说:
集合框架接口中的许多方法都是根据 equals 方法定义的
但:
此规范不应被解释为暗示调用 Collection.contains with a non-null argument o 将导致为任何元素 e 调用 o.equals(e)
因此,我的结论是,这是某种技巧,允许实现定义不同的行为(例如,接受空元素)和优化(例如,覆盖类的 equals 方法,以便您可以检查元素是否包含在集合中而无需引用它)。
我将通过一个例子来解释最新的:
public class A {
public void initialize() {
// Lots of code and heavy initialization
}
public String id;
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public boolean equals(Object o) {
return this.hashCode() == o.hashCode();
}
}
然后:
SomeCollection<A> collection = new SomeCollection<A>();
// Create an element and add it to the collection
A a = new A();
a.initialize(); // Heavy initialization
element.id = "abc";
collection.add(a);
// Check if the collection contains that element
// We create a second object with the same id, but we do not initialize it
A b = new A();
b.id = "abc";
// This works for many common collections (i.e. ArrayList and HashSet)
collection.contains(b);
实际上,还有更多像这样的方法。因此,我不认为这是为了兼容性,但它是故意允许这种解决方案而制作的。indexOf(Object o)
remove(Object o)
http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#contains(java.lang.Object)