【发布时间】:2017-04-22 05:57:07
【问题描述】:
由于 TreeMap 排序仅基于键,因此我使用自定义对象作为树图中的键。在我看来,在这种情况下,我尊重 equals 和 compareTo 之间的约定,如果两个对象相等,te compareTo 返回 0。
对象的代码下面:
public final class UserHighScore implements Comparable<UserHighScore>{
private final int userId;
private final int value;
public UserHighScore(int userId, int value) {
this.userId = userId;
this.value = value;
}
public int getUserId() {
return userId;
}
public int getValue() {
return value;
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof UserHighScore)) {
return false;
}
UserHighScore userHighScore = (UserHighScore) obj;
return userHighScore.userId==userId;
}
@Override
public int compareTo(UserHighScore uh) {
if(uh.getUserId()==this.getUserId()) return 0;
if(uh.getValue()>this.getValue()) return 1;
return -1;
}
}
下面是导致问题的方法:
如果用户 ID 相同,我想返回 0 以避免重复,那么如果我执行 map.put(userHighscore),它应该自动替换地图中是否存在具有相同用户 ID 的另一个对象。 但是,如果用户不同,我希望根据他们的值对他们进行排序。 这种方法对于一个线程来说工作得很好,但是我的应用程序是并发的,当有多个线程时,它会向地图添加重复项。 我的问题是高分地图,它是一个 concurrentHasmap,里面包含一个树形图。
你觉得我的方法有什么问题吗?
【问题讨论】:
-
如果你使用多个线程,你的同步策略是什么?
-
您可能想要使用来自并发包docs.oracle.com/javase/tutorial/essential/concurrency/…的映射
-
已经这样做了。我已经编辑了问题以显示代码,我正在使用 concurrentHashmap
标签: java collections concurrency treemap sortedmap