我有以下Java代码:
public void myMethod (final Map pFeatureGroupsFromPackage) {
final Set<String> keys = pFeatureGroupsFromPackage.keySet();
for (final String key : keys) {
tmpList = (List<FeatureKey>) pFeatureGroupsFromPackage.get(key);
// do whatever
}
}
我从“findBugs”收到警告,告诉以下内容:
方法myMethod
无效地使用keySet迭代器而不是entrySet迭代器。
警告是在tmpList
分配时完成的。
我不明白为什么这样效率低下。事实上,keys
列表只计算一次。
任何意见?感谢。
答案 0 :(得分:24)
不是迭代keySet
并调用get
来获取每个键的相应值,而是遍历entrySet
:
final Set<Map.Entry<String, List<FeatureKey>>> entries = pFeatureGroupsFromPackage.entrySet();
for (Map.Entry<String, List<FeatureKey>> entry : entries) {
String key = entry.getKey();
List<FeatureKey> tmpList = entry.getValue();
// do whatever
}
这样您就不必在地图中查找每个键;你可以一次性获得关键和价值。
另外,使用类型参数声明您的Map
:
public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) {
// ...
}
答案 1 :(得分:4)
您获得所有密钥,然后搜索集合中的每个密钥
Map.EntrySet迭代会更快,一个小例子:
但你也应该使用泛型......
Set entries = map.entrySet();
Iterator entryIter = entries.iterator();
System.out.println("The map contains the following associations:");
while (entryIter.hasNext()) {
Map.Entry entry = (Map.Entry)entryIter.next();
Object key = entry.getKey(); // Get the key from the entry.
Object value = entry.getValue(); // Get the value.
System.out.println( " (" + key + "," + value + ")" );
}
答案 2 :(得分:4)
这可以帮到你:
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
答案 3 :(得分:0)
可能是您要两次查询地图:
使用entryset迭代器将迭代地图一次。
答案 4 :(得分:0)
通过keySet迭代器访问HashMap比在TreeMap上使用keySet迭代器更快。
答案 5 :(得分:0)
嘿Luixv, 使用keysey迭代器的原因不如entryset iteratot有效,第一个选项仍然需要使用Map.get(key)lookeup,而第二个选项则避免使用。
答案 6 :(得分:0)
示例代码:
for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
System.out.println(i.getValue() + " " + i.getKey()));
}