即使值存在,Hashmap get(key)也返回null

时间:2014-04-02 15:39:26

标签: java android null hashmap

我试图在哈希映射中保存数据并检索它。存在与键对应的值,它仍然返回null。我也实现了equals()和hashCode()方法。

ArrayList<Friends> friendsArrayList = new ArrayList<Friends>();
HashMap<Friends,ArrayList<FriendDetails>> friendDetailsHashMap = new HashMap<Friends, ArrayList<FriendDetails>>();
int mSelectedIndex = 0;
...
Friends f = friendsArrayList.get(mSelectedIndex);
ArrayList<MeterGroups> temp2 = friendDetailsHashMap.get(mp); //<== This is where it returns null

我的ObjectClass Friends.java:

import java.io.Serializable;

public class Friends implements Serializable {
private String friendName;
private String friendId;
private double distanceFromCurrentLocation;

public Friends(String name, String id)
{
    this.friendName = name;
    this.friendId = id;
    this.distanceFromCurrentLocation = getDistanceFromCurrentLocation();

}

public String getFriendName(){
    return friendName;
}

public void setFriendName(String name){
    this.friendName = name;
}

public void setFriendId(String id){
    this.friendId = id;
}
public String getFriendId(){
    return friendId;
}

public double getDistanceFromCurrentLocation(){
    return 0.0;
}

public int hashCode(){
    return friendName.hashCode()*friendId.hashCode();
}

public boolean equals(Object o){
    if(o == null) {
        return false;
    }
    if(!(o instanceof Friends)) {
        return false;
    }

    Friends other = (Friends) o;
    return this.friendId == other.friendId; //friendId is a unique value
   }
}

2 个答案:

答案 0 :(得分:3)

您的equals实施使用friendId。您的hashCode实施同时使用friendName friendId。因此,可以有两个具有不同哈希码的相等对象。

此外,您使用==来比较equals中的字符串,而不是equals。那是比较引用而不是文本数据。

此外,您还需要处理friendIdfriendName null的可能性。 (所以不要无条件地对它们进行equalshashCode调用。)您可能希望使用Guava,其中包含hashCode和{equals { {1}}。

最后,您使用可变数据类型作为哈希映射中的键。这通常是一个坏主意 - 如果您将一个键添加到地图然后以一种会影响哈希码的方式改变对象,您将无法在以后使用相同的键获取。我强烈鼓励你使用不可变类型作为地图键。

您需要确定您的平等标准是什么,并在hashCodeequals之间保持一致。如果这两者不一致,你可能会看到这样的问题。

答案 1 :(得分:2)

问题出在朋友的.equals方法中。

比较字符串时,请使用.equals而不是==

所以最后一行应该是这样的:

return this.friendId.equals(other.friendId);