K
- このマップで保持されるキーの型V
- マップされる値の型public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
この実装は、ハッシュ関数が複数のバケットで要素を適切に分散させることを想定し、基本オペレーション(getおよびput)で一定時間の性能を提供します。コレクション・ビューの反復処理では、HashMapのインスタンスの「容量」(バケット数)とそのサイズ(キーと値のマッピングの数)の合計に比例した時間が必要です。したがって、反復処理の性能が重要な場合は、初期容量をあまり高く(負荷係数をあまり低く)設定しないことが非常に重要です。
HashMapのインスタンスには、その性能に影響を与える2つのパラメータである初期容量および負荷係数があります。容量はハッシュ表のバケット数であり、初期容量は単純にハッシュ表が作成された時点での容量です。負荷係数は、ハッシュ表がどの程度いっぱいになると、その容量が自動的に増加されるかの基準です。ハッシュ表エントリ数が負荷係数と現在の容量の積を超えると、ハッシュ表のハッシュがやり直され (つまり、内部データ構造が再構築され)、ハッシュ表のバケット数は約2倍になります。
ほとんどの場合、デフォルトの負荷係数(.75)では、時間コストとスペース・コストの釣合いを取ります。この値を大きくすると、スペースのオーバーヘッドが減少しますが、参照コストが増加し、getおよびputを含むHashMapクラスのほとんどのオペレーションが影響を受けます。初期容量を設定するときは、rehashオペレーションの回数を最小限に抑えるために、マップのエントリ予定数および負荷係数を考慮する必要があります。初期容量が、エントリの最大数を負荷係数で割った値より大きい場合、rehashオペレーションは起こりません。
HashMapのインスタンスに多くのマッピングが格納される場合は、この表の作成時に十分な大きさの容量を設定すると、必要に応じてハッシュを自動的にやり直して表を大きくするよりも、マッピングをより効率的に格納できます。同じhashCode()
で多数のキーを使用すると、必ずいずれかのハッシュ表のパフォーマンスが低下することに注意してください。影響を軽減するため、キーがComparable
である場合は、このクラスでキー間の比較順序を使用してキーの重複を解消できます。
この実装はsynchronizedされません。複数のスレッドが並行してハッシュ・マップにアクセスし、それらのスレッドの少なくとも1つが構造的にマップを変更する場合は、外部でその同期をとる必要があります。構造的な変更とは、1つ以上のマッピングを追加または削除するオペレーションのことです。すでにインスタンスに格納されているキーに関連付けられた値を変更することは構造的な変更ではありません。これは通常、マップを自然にカプセル化する一部のオブジェクトでsynchronizedすることによって達成されます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedMap
メソッドを使用してマップを「ラップ」することをお薦めします。マップが誤ってsynchronizedなしでアクセスされるのを防ぐために、作成時に行うことをお薦めします。
Map m = Collections.synchronizedMap(new HashMap(...));
このクラスの「コレクション・ビュー・メソッド」によって返されるイテレータはフェイルファストです。イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でマップが構造的に変更されると、イテレータはConcurrentModificationException
をスローします。このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。フェイルファスト・イテレータは最善努力原則に基づき、ConcurrentModificationExceptionをスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。
このクラスは、Java Collections Frameworkのメンバーです。
Object.hashCode()
, Collection
, Map
, TreeMap
, Hashtable
, 直列化された形式AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
コンストラクタと説明 |
---|
HashMap()
デフォルトの初期容量(16)とデフォルトの負荷係数(0.75)を持つ、空のHashMapを作成します。
|
HashMap(int initialCapacity)
指定された初期容量とデフォルトの負荷係数(0.75)を持つ、空のHashMapを作成します。
|
HashMap(int initialCapacity, float loadFactor)
指定された初期容量と負荷係数を持つ、空のHashMapを作成します。
|
HashMap(Map<? extends K,? extends V> m)
指定されたMapと同じマッピングで新しいHashMapを作成します。
|
修飾子と型 | メソッドと説明 |
---|---|
void |
clear()
すべてのマッピングをマップから削除します。
|
Object |
clone()
HashMapのインスタンスのシャロー・コピーを返します。キーと値は、それ自体は複製されません。
|
V |
compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
指定されたキーと現在マップされている値に対するマッピングの計算を試みます(現在のマッピングが存在しない場合は
null )。 |
V |
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
指定されたキーがまだ値に関連付けられていない(または
null にマップされている)場合、指定されたマッピング関数を使用してその値の計算を試行し、null でない場合はそれをこのマップに入力します。 |
V |
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
指定されたキーの値が存在していてnull以外の場合、キーと現在マップされている値から新しいマッピングの計算を試みます。
|
boolean |
containsKey(Object key)
指定のキーのマッピングがこのマップに含まれている場合にtrueを返します。
|
boolean |
containsValue(Object value)
このマップが1つまたは複数のキーを指定された値にマッピングしている場合にtrueを返します。
|
Set<Map.Entry<K,V>> |
entrySet()
このマップに含まれるマッピングの
Set ビューを返します。 |
void |
forEach(BiConsumer<? super K,? super V> action)
このマップのすべてのエントリの処理が完了するかアクションから例外がスローされるまで、各エントリに対して指定されたアクションを実行します。
|
V |
get(Object key)
指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合は
null を返します。 |
V |
getOrDefault(Object key, V defaultValue)
指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合は
defaultValue を返します。 |
boolean |
isEmpty()
このマップがキーと値のマッピングを保持しない場合にtrueを返します。
|
Set<K> |
keySet()
このマップに含まれるキーの
Set ビューを返します。 |
V |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
指定されたキーがまだ値と関連付けられていないかnullと関連付けられている場合、指定されたnull以外の値に関連付けます。
|
V |
put(K key, V value)
指定された値と指定されたキーをこのマップに関連付けます。
|
void |
putAll(Map<? extends K,? extends V> m)
指定されたマップからすべてのマッピングをマップにコピーします。
|
V |
putIfAbsent(K key, V value)
指定されたキーがまだ値に関連付けられていない(または、
null にマップされている)場合は、それを指定された値に関連付けてnull を返します。それ以外の場合は、現在の値を返します。 |
V |
remove(Object key)
指定されたキーのマッピングがあればマップから削除します。
|
boolean |
remove(Object key, Object value)
指定された値に指定されたキーが現在マッピングされている場合にのみ、そのキーのエントリを削除します。
|
V |
replace(K key, V value)
指定されたキーがなんらかの値に現在マッピングされている場合にのみ、そのキーのエントリを置換します。
|
boolean |
replace(K key, V oldValue, V newValue)
指定されたキーが指定された値に現在マッピングされている場合にのみ、そのキーのエントリを置換します。
|
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function)
すべてのエントリが処理されるか、または関数が例外をスローするまで、各エントリの値を、そのエントリで指定された関数を呼び出した結果で置換します。
|
int |
size()
このマップ内のキー値マッピングの数を返します。
|
Collection<V> |
values()
このマップに含まれる値の
Collection ビューを返します。 |
equals, hashCode, toString
public HashMap(int initialCapacity, float loadFactor)
initialCapacity
- 初期容量loadFactor
- 負荷係数IllegalArgumentException
- 初期容量が負であるか、負荷係数が正でない場合public HashMap(int initialCapacity)
initialCapacity
- 初期容量。IllegalArgumentException
- 初期容量が負の場合。public HashMap()
public HashMap(Map<? extends K,? extends V> m)
m
- マッピングがこのマップに配置されるマップNullPointerException
- 指定されたマップがnullの場合public int size()
public boolean isEmpty()
public V get(Object key)
null
を返します。
つまり、このメソッドは、(key==null ? k==null : key.equals(k))
となるキーk
から値v
へのマッピングがこのマップに含まれている場合はv
を返し、それ以外の場合はnull
を返します。(このようなマッピングは1つのみ存在できます。)
戻り値null
は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーをnull
にマップすることもあります。containsKey
オペレーションを使うと、これらの2つの場合を区別できます。
get
、インタフェース: Map<K,V>
get
、クラス: AbstractMap<K,V>
key
- 関連付けられた値が返されるキーnull
put(Object, Object)
public boolean containsKey(Object key)
containsKey
、インタフェース: Map<K,V>
containsKey
、クラス: AbstractMap<K,V>
key
- このマップ内にあるかどうかが判定されるキーpublic V put(K key, V value)
public void putAll(Map<? extends K,? extends V> m)
putAll
、インタフェース: Map<K,V>
putAll
、クラス: AbstractMap<K,V>
m
- このマップに格納されるマッピングNullPointerException
- 指定されたマップがnullの場合public void clear()
public boolean containsValue(Object value)
containsValue
、インタフェース: Map<K,V>
containsValue
、クラス: AbstractMap<K,V>
value
- このマップにあるかどうかが判定される値public Set<K> keySet()
Set
ビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAllオペレーションはサポートしていません。public Collection<V> values()
Collection
ビューを返します。コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。コレクションは要素の削除をサポートします。Iterator.remove、Collection.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAllオペレーションはサポートしていません。public Set<Map.Entry<K,V>> entrySet()
Set
ビューを返します。セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーション、またはイテレータにより返されるマップ・エントリに対するsetValueオペレーションを除く)。セットは要素の削除をサポートします。Iterator.remove、Set.remove、removeAll、retainAll、およびclearオペレーションで対応するマッピングをマップから削除します。addまたはaddAllオペレーションはサポートしていません。public V getOrDefault(Object key, V defaultValue)
Map
defaultValue
を返します。getOrDefault
、インタフェース: Map<K,V>
key
- 関連付けられた値が返されるキーdefaultValue
- キーのデフォルト・マッピングdefaultValue
public V putIfAbsent(K key, V value)
Map
null
にマップされている)場合は、それを指定された値に関連付けてnull
を返します。それ以外の場合は、現在の値を返します。putIfAbsent
、インタフェース: Map<K,V>
key
- 指定された値が関連付けられるキーvalue
- 指定されたキーに関連付けられる値null
。(また、実装がnull値をサポートしている場合、戻り値null
は、以前にマップでキーとnull
が関連付けられていたことを示す場合もある。)public boolean remove(Object key, Object value)
Map
public boolean replace(K key, V oldValue, V newValue)
Map
public V replace(K key, V value)
Map
public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
Map
null
にマップされている)場合、指定されたマッピング関数を使用してその値の計算を試行し、null
でない場合はそれをこのマップに入力します。
関数がnull
を返した場合、マッピングは記録されません。関数自体が(非チェック)例外をスローした場合、その例外は再スローされ、マッピングは記録されません。もっとも一般的な用途は、次のように初期のマップされた値またはメモ化された結果として機能する新しいオブジェクトを構築することです。
map.computeIfAbsent(key, k -> new Value(f(k)));
または、1つのキーで複数の値をサポートする複数値マップMap<K,Collection<V>>
を実装することです。
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
computeIfAbsent
、インタフェース: Map<K,V>
key
- 指定された値が関連付けられるキーmappingFunction
- 値を計算するための関数public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Map
関数がnull
を返した場合、マッピングは削除されます。関数自体が(非チェック)例外をスローした場合、その例外は再スローされ、現在のマッピングは変更されません。
computeIfPresent
、インタフェース: Map<K,V>
key
- 指定された値が関連付けられるキーremappingFunction
- 値を計算するための関数public V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Map
null
)。たとえば、次のように、値のマッピングにString
msgを作成または追加します。
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(このような目的で使用するmerge()
メソッドは、多くの場合、より単純です。)
関数がnull
を返した場合、マッピングは削除されます(最初から存在しない場合は、存在しないままです)。関数自体が(非チェック)例外をスローした場合、その例外は再スローされ、現在のマッピングは変更されません。
public V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
Map
null
の場合は削除します。このメソッドは、1つのキーに対する複数のマップされた値を結合するときに使用できます。たとえば、次のように、値のマッピングにString msg
を作成または追加します。
map.merge(key, msg, String::concat)
関数がnull
を返した場合、マッピングは削除されます。関数自体が(非チェック)例外をスローした場合、その例外は再スローされ、現在のマッピングは変更されません。
public void forEach(BiConsumer<? super K,? super V> action)
Map
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Map
replaceAll
、インタフェース: Map<K,V>
function
- 各エントリに適用する関数 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.