我有一個對象,它有一個UUID類型的ID。如果此UUID匹配,則它等於另一個對象。我可以確認我正確執行了equals()
和compareTo()
,並且每個接口都提供了@Override
接口。爲什麼我不能從該地圖獲取()我的對象的副本?
爲什麼我得到null當我查詢我的對象與副本的ID?
public class SomeId implements Comparable<SomeId> {
UUID id;
SomeId(
UUID id)
{
this.id = id;
}
UUID getUniqueId() {
return id;
}
@Override
public String toString() {
return id.toString();
}
@Override
public boolean equals(
Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SomeId o = (SomeId)obj;
boolean b = id.equals(o.getUniqueId());
return b;
}
@Override
public int compareTo(
SomeId val)
{
return id.compareTo(val.getUniqueId());
}
}
主營:
Map<SomeId, Integer> map = new HashMap<>();
SomeId id1 = new SomeId(UUID.randomUUID());
SomeId id2 = new SomeId(UUID.fromString(id1.toString()));
if (id1.equals(id2))
System.out.println("Equal!");
if (id1.compareTo(id2) == 0)
System.out.println("Equal!");
System.out.println(id1);
System.out.println(id2);
map.put(id1, new Integer(1));
System.out.println(map.get(id1));
// Always retrns null?
System.out.println(map.get(id2));
運行這個程序,我得到以下輸出:
Equal!
Equal!
f9b9b419-659e-4da7-9043-e7e51bef7bad
f9b9b419-659e-4da7-9043-e7e51bef7bad
1
null
您必須覆蓋' hashCode()'在'SomeId'類中。 – Eran
您還必須正確實現'hashCode()'方法,而不僅僅是'equals()'方法。請參閱:[Java HashMap如何處理具有相同哈希代碼的不同對象?](http://stackoverflow.com/questions/6493605/how-does-a-java-hashmap-handle-different-objects-with-the -same-hash-code/6493946#6493946) – Jesper