15

次の 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割り当て時に行われます。

なぜこれが非効率なのか理解できません。実際、keysリストは一度だけ計算されます。任意のコメント?ありがとう。

4

7 に答える 7

29

を繰り返して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) {
    // ...
}
于 2011-03-25T09:57:41.537 に答える
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 + ")" );
      }
于 2011-03-25T09:56:27.003 に答える
1

マップを2回クエリしている可能性があります。

  • 最初に鍵については、
  • 値の2番目

エントリセットイテレータを使用すると、マップが1回繰り返されます。

于 2011-03-25T09:58:14.710 に答える
0

keySetイテレータを介してHashMapにアクセスすることは、TreeMapでkeySetイテレータを使用するよりもさらに高速です。

于 2011-03-25T09:59:50.307 に答える
0

Luixv さん、keysey イテレータの使用がエントリセット イテレータよりも効果的でない理由は、最初のオプションでは、2 番目のオプションでは回避される Map.get(key) ルックアップを使用する必要があるためです。

于 2011-03-25T10:01:47.673 に答える