私は次の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
は、entrySetイテレータの代わりにkeySetイテレータを非効率的に使用します。警告はtmpList
assignmentで行われます。
これが非効率的である理由がわかりません。実際、keys
listは1回だけ計算されます。任意のコメント?ありがとう。
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);
}
マップを2回クエリしている可能性があります。
Entryset iteratorを使用すると、マップを1回繰り返します。
KeySetイテレータを介してHashMapにアクセスすることは、TreeMapでkeySetイテレータを使用するよりもさらに高速です。
ちょっとLuixv、keyseyイテレータを使用する理由はentryset iteratotよりも効果的ではありません。最初のオプションでは、2番目のオプションでは回避されるMap.get(key)ルックアップを使用する必要があるためです。
サンプルコード:
for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
System.out.println(i.getValue() + " " + i.getKey()));
}