2016-12-05 48 views
0

我有一個對象,它有一個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 
+6

您必須覆蓋' hashCode()'在'SomeId'類中。 – Eran

+5

您還必須正確實現'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

回答

1

請執行的hashCode ;-)

public int hashCode() { 
    final int PRIME = 59; 
    int result = 1; 
    final Object $id = this.id; 
    result = result * PRIME + ($id == null ? 43 : $id.hashCode()); 
    return result; 
} 
+0

這是我第一次實現一個用作密鑰的類。我以爲我已經用「Comparable」來覆蓋所有東西! – Zhro

+0

這是好的@Zhro請永遠記得同時實現equals和hashCode ;-) – fangdi