2016-12-05 51 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