Java では、HashMap に次のような形式のデータを完全に入力します。
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
ランダムキーの存在をチェックするとき、何が速いか、たとえば 100:
if (map.get(100) == null))
また
if (!map.containsKey(100))
?
質問は、マイクロ最適化の観点から興味深いものです。
Java では、HashMap に次のような形式のデータを完全に入力します。
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
ランダムキーの存在をチェックするとき、何が速いか、たとえば 100:
if (map.get(100) == null))
また
if (!map.containsKey(100))
?
質問は、マイクロ最適化の観点から興味深いものです。
余分な関数呼び出しが発生するため( を呼び出すだけです)、非常にわずかに遅くなるはずcontainsKey
です(最適化されてしまう可能性があります。Javaがそうするかどうかはわかりません)。次のようになります。getEntry
containsKey
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
ます。実際にチェックするべきでした。
実際、両方のアプローチは同じです。ソース コードを調べると、java.util.HashMap
次の containsKey 実現を見つけることができます。
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
この 2 つは、キーの場合にyou を返す可能性があることreturn
を除いて、型のみが異なりますが、 を返す2 つの可能なケースを区別するために使用できるyouを返します。map.get(key)
null
map.containsKey(key)
boolean
map.get(key)
null
この2つのアプローチに違いはありません。主な違いは、次に何をするかだけです。値が必要な場合は、もちろん、getによって値が得られます。