9

Java では、HashMap に次のような形式のデータを完全に入力します。

HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);

ランダムキーの存在をチェックするとき、何が速いか、たとえば 100:

if (map.get(100) == null))

また

if (!map.containsKey(100))

?

質問は、マイクロ最適化の観点から興味深いものです。

4

4 に答える 4

20

余分な関数呼び出しが発生するため( を呼び出すだけです)、非常にわずかに遅くなるはずcontainsKeyです(最適化されてしまう可能性があります。Javaがそうするかどうかはわかりません)。次のようになります。getEntrycontainsKey

public boolean containsKey(Object key) {
  return getEntry(key) != null;
}

ただし、一方で、他の実装ではcontainsKeyわずかに高速Mapになる可能性があることに注意してください(ただし、標準の Java API ではおそらくそうではありません)。

一般的に、私の実装は次のようになります: (の必要性を回避するcontainsKey)

int[] arr = map.get(100);
if (arr == null) // doesn't exist
  // do stuff
else // exists
  // do stuff with arr

以下は間違いなく上記よりも遅くなります:(探しているアイテムが妥当な時間存在する場合)

if (!map.containsKey(100)) // doesn't exist
  // do stuff
else // exists
{
  int[] arr = map.get(100);
  // do stuff with arr
}

編集:のソースを提供してくれた zvzdhk に感謝しcontainsKeyます。実際にチェックするべきでした。

于 2013-02-09T13:04:49.227 に答える
6

実際、両方のアプローチは同じです。ソース コードを調べると、java.util.HashMap次の containsKey 実現を見つけることができます。

public boolean containsKey(Object key) {
    return getEntry(key) != null;
}
于 2013-02-09T13:04:52.797 に答える
3

この 2 つは、キーの場合にyou を返す可能性があることreturnを除いて、型のみが異なりますが、 を返す2 つの可能なケースを区別するために使用できるyouを返します。map.get(key)nullmap.containsKey(key)booleanmap.get(key)null

于 2013-02-09T13:10:03.433 に答える
1

この2つのアプローチに違いはありません。主な違いは、次に何をするかだけです。値が必要な場合は、もちろん、getによって値が得られます。

于 2013-02-09T13:30:01.567 に答える