改性按照JavaDoc of java.util.HashSet.contains()方法假如果此集合包含指定的元素不以下HashSet.contains(object)返回例如後插入
返回true。更 正式,返回true,當且僅當此set包含元素e 這樣(O == NULLé== NULL:o.equals(e)項)。
然而,這似乎並沒有爲下面的代碼工作:
public static void main(String[] args) {
HashSet<DemoClass> set = new HashSet<DemoClass>();
DemoClass toInsert = new DemoClass();
toInsert.v1 = "test1";
toInsert.v2 = "test2";
set.add(toInsert);
toInsert.v1 = null;
DemoClass toCheck = new DemoClass();
toCheck.v1 = null;
toCheck.v2 = "test2";
System.out.println(set.contains(toCheck));
System.out.println(toCheck.equals(toInsert));
}
private static class DemoClass {
String v1;
String v2;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((v1 == null) ? 0 : v1.hashCode());
result = prime * result + ((v2 == null) ? 0 : v2.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DemoClass other = (DemoClass) obj;
if (v1 == null) {
if (other.v1 != null)
return false;
} else if (!v1.equals(other.v1))
return false;
if (v2 == null) {
if (other.v2 != null)
return false;
} else if (!v2.equals(other.v2))
return false;
return true;
}
}
打印出:
假
真正
因此,儘管equals
方法返回true
,HashSet.contains()
返回false
。
我想這是因爲我修改了toInsert實例之後,將它添加到集合。
然而,這是沒有記錄(或至少我沒能找到這樣的)。也應該使用equals方法上面引用的文檔,但它似乎並不如此。
你改變了哈希,這被HashSet記住,因此它不能識別一個對象。 – Dims
[HashSet包含自定義對象的問題]的可能重複(http://stackoverflow.com/questions/5110376/hashset-contains-problem-with-custom-objects) – SpaceTrucker