我试图在哈希映射中保存数据并检索它。存在与键对应的值,它仍然返回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
}
}
答案 0 :(得分:3)
您的equals
实施仅使用friendId
。您的hashCode
实施同时使用friendName
和 friendId
。因此,可以有两个具有不同哈希码的相等对象。
此外,您使用==
来比较equals
中的字符串,而不是equals
。那是比较引用而不是文本数据。
此外,您还需要处理friendId
或friendName
null
的可能性。 (所以不要无条件地对它们进行equals
或hashCode
调用。)您可能希望使用Guava,其中包含hashCode
和{equals
{ {1}}。
最后,您使用可变数据类型作为哈希映射中的键。这通常是一个坏主意 - 如果您将一个键添加到地图然后以一种会影响哈希码的方式改变对象,您将无法在以后使用相同的键获取。我强烈鼓励你使用不可变类型作为地图键。
您需要确定您的平等标准是什么,并在hashCode
和equals
之间保持一致。如果这两者不一致,你可能会看到这样的问题。
答案 1 :(得分:2)
问题出在朋友的.equals方法中。
比较字符串时,请使用.equals而不是==
所以最后一行应该是这样的:
return this.friendId.equals(other.friendId);