【发布时间】:2012-08-05 02:00:02
【问题描述】:
我实现了here找到的非常好的排序解决方案:
static <K,V extends Comparable<? super V>> SortedSet<Map.Entry<K,V>>
entriesSortedByValues(Map<K,V> map) {
SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
new Comparator<Map.Entry<K,V>>() {
@Override
public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
int res = e1.getValue().compareTo(e2.getValue());
return res != 0 ? res : 1;
}
}
);
sortedEntries.addAll(map.entrySet());
return sortedEntries;
}
代码似乎运行良好。然而,FindBugs 抱怨这一行:
sortedEntries.addAll(map.entrySet());
投诉是:
Bug:添加条目集的元素可能会由于重用 Map.Entry 对象在 com.local.sem.util.MapUtil.entriesSortedByValues(地图)
entrySet() 方法允许返回底层视图 在其中一个 Entry 对象被重用和返回的 Map 迭代。从 Java 1.6 开始,IdentityHashMap 和 EnumMap 都这样做了。 在遍历这样的 Map 时,Entry 值仅在直到 你前进到下一次迭代。例如,如果您尝试通过 这样一个 entrySet 到一个 addAll 方法,事情就会大错特错。
信心:正常,等级:麻烦 (14)
模式:DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS
类型:DMI,类别:BAD_PRACTICE(不良做法)
谁能告诉我这是什么意思,或者它是否真的与这个特定的代码相关?
【问题讨论】: