36

次の方法を参照してください。

public Set<LIMSGridCell> getCellsInColumn(String columnIndex){
    Map<String,LIMSGridCell> cellsMap = getCellsMap();
    Set<LIMSGridCell> cells = new HashSet<LIMSGridCell>();
    Set<String> keySet = cellsMap.keySet();
    for(String key: keySet){
      if(key.startsWith(columnIndex)){
        cells.add(cellsMap.get(key));
      }
    }
    return cells;
  }

FindBugsはこの警告メッセージを出します:

" entrySetイテレータの代わりにkeySetイテレータを非効率的に使用する このメソッドは、keySetイテレータから取得したキーを使用してMapエントリの値にアクセスします。Mapを回避するには、マップのentrySetでイテレータを使用する方が効率的です。 .get(key)ルックアップ。」

4

5 に答える 5

57

すべてのキーを取得し (マップ全体にアクセス)、一部のキーについては、再度マップにアクセスして値を取得します。

マップを反復処理してマップ エントリ ( Map.Entry ) (キーと値のペア) を取得し、マップに 1 回だけアクセスできます。

Map.entrySet()Map.Entryは、キーと対応する値を持つ s のセットをそれぞれ配信します。

for ( Map.Entry< String, LIMSGridCell > entry : cellsMap.entrySet() ) {
    if ( entry.getKey().startsWith( columnIndex ) ) {
        cells.add( entry.getValue() );
    }
}

: マップ エントリを使用すると、エントリごとにオブジェクトがインスタンス化されるため、これが大幅に改善されるとは思えません。get()これが、必要な参照を直接呼び出して取得するよりも本当に速いかどうかはわかりません。

于 2012-09-28T11:38:44.970 に答える
9

マップ内のキーのセットを取得し、各キーを使用してマップから値を取得しています。

代わりに、 経由で返されたMap.Entryキーと値のペアを単純に繰り返すことができますentrySet()。そうすれば、比較的コストのかかるルックアップを回避できます (ここでは「相対的get()」という言葉の使用に注意してください) 。

例えば

for (Map.Entry<String,LIMSGridCell> e : map.entrySet()) {
   // do something with...
   e.getKey();
   e.getValue();
}
于 2012-09-28T11:38:45.067 に答える
2

これが提案です。あなたの質問に対する答えではありません。ConcurrentHashMap を使用している場合。以下は、javadocに記載されているイテレータの動作です

ビューのイテレータは、ConcurrentModificationException を決してスローしない「弱い一貫性のある」イテレータであり、イテレータの構築時に存在していた要素をトラバースすることを保証し、構築後の変更を反映する可能性があります (ただし保証はされません)。

したがって、EntrySet イテレーターを使用する場合。これには、古いキーと値のペアが含まれている可能性があります。そのほうがいいでしょう。keySet iterator(); からキーを取得します。コレクションで値を確認します。これにより、コレクションから最新の変更を確実に取得できます。

フェイルセーフ イテレータに問題がない場合。次に、このリンクを確認してください。それはentrySetを使用すると述べています。パフォーマンスを少し改善します。

于 2014-06-26T08:21:35.860 に答える
0

キーセットでは、すべてのキーを取得する必要があり、コレクション内のすべてのキーを検索します。

さらに、キーごとにマップを 2 回照会する必要がないため、entrySet をループする方が高速です。

マップのキーまたは値のみが必要な場合は、代わりに keySet() または values() を使用します。

于 2015-05-14T06:54:32.887 に答える