Uma*_*Uma 3 java null android 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
   }
}
您的equals实现仅使用friendId. 您的hashCode实现同时使用friendName 和 friendId。因此,可以存在两个具有不同哈希码的相等对象。
此外,您使用, 而不是==中的字符串进行比较。这是比较参考文献而不是文本数据。equalsequals
此外,您还需要处理friendIdorfriendName的可能性null。(所以不要只是无条件地调用equals或hashCode对它们进行调用。)您可能很想使用GuavahashCode ,它具有在编写和时提供帮助的方法equals。
最后,您使用可变数据类型作为哈希映射中的键。这通常是一个坏主意 - 如果您向映射添加一个键,然后以影响哈希码的方式改变对象,那么稍后您将无法使用相同的键来获取。我强烈鼓励您使用不可变类型作为映射键。
您需要决定您的平等标准是什么,并在 和 之间保持hashCode一致equals。如果这两者不一致,您很可能会看到这样的问题。
| 归档时间: | 
 | 
| 查看次数: | 5594 次 | 
| 最近记录: |