[英]Java Iteration over a keySet
我有以下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
列表只計算一次。 任何意見? 謝謝。
而不是迭代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) {
// ...
}
你得到了所有的密鑰,然后搜索集合中的每個密鑰
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 + ")" );
}
這可以幫助你:
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);
}
示例代碼:
for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
System.out.println(i.getValue() + " " + i.getKey()));
}
可能是您要兩次查詢地圖:
使用entryset迭代器將迭代地圖一次。
通過keySet迭代器訪問HashMap比使用TreeMap上的keySet迭代器更快。
嘿Luixv,使用keysey迭代器的原因不如entryset iteratot有效,第一個選項仍然需要使用Map.get(key)lookeup,這是第二個選項避免的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.