LinkedHashMap クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
明確に定義された検出順序を持つ、 Map インターフェイスのハッシュ テーブルとリンク リストの実装。
[Android.Runtime.Register("java/util/LinkedHashMap", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })]
public class LinkedHashMap : Java.Util.HashMap, IDisposable, Java.Util.ISequencedMap
[<Android.Runtime.Register("java/util/LinkedHashMap", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })>]
type LinkedHashMap = class
inherit HashMap
interface IMap
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface ISequencedMap
- 継承
- 属性
- 実装
注釈
明確に定義された検出順序を持つ、 Map インターフェイスのハッシュ テーブルとリンク リストの実装。 この実装は HashMap とは異なり、2 重にリンクされたリストがそのすべてのエントリを実行して維持されます。 このリンクされたリストは、検出順序 (反復の順序) を定義します。これは通常、キーがマップに挿入された順序 (挿入順) です。 最も新しく挿入されたエントリ (長いエントリ) が最初で、最も若いエントリが最後です。
メソッドを使用してキーをマップにputしても、発生順序は影響を受けないことを確認してください。 (kが呼び出しの直前にmを返す場合、m.put(k, v)が呼び出されると、キー m.containsKey(k)がマップ trueに再挿入されます)。このマップの逆順ビューは逆の順序で表示され、最も若いエントリが最初に表示され、最も長いエントリが最後に表示されます。 マップに既に存在するエントリの検出順序は、 #putFirst putFirst メソッドと #putLast putLast メソッドを使用して変更できます。
この実装は、HashMapに関連するコストの増加を発生させることなく、Hashtable (およびTreeMap) によって提供される不特定の、一般的に混同的な順序付けからクライアントを解放します。 元のマップの実装に関係なく、元のマップと同じ順序のマップのコピーを生成するために使用できます。
{@code
void foo(Map<String, Integer> m) {
Map<String, Integer> copy = new LinkedHashMap<>(m);
...
}
}
この手法は、モジュールが入力時にマップを受け取り、それをコピーし、後でコピーの順序によって決定される結果を返す場合に特に便利です。 (クライアントは、通常、提示されたのと同じ順序で返されることを高く評価します)。
特殊な #LinkedHashMap(int,float,boolean) constructor が提供され、そのエントリが最後にアクセスされた順序である、最も最近アクセスされた順 (access-order) に到達した順序を持つ、リンクされたハッシュ マップを作成できます。 この種のマップは、LRU キャッシュの構築に適しています。
put、putIfAbsent、get、getOrDefault、compute、computeIfAbsent、computeIfPresent、またはmergeメソッドを呼び出すと、対応するエントリにアクセスできます (呼び出しが完了した後に存在すると仮定します)。
replaceメソッドは、値が置き換えられた場合にのみエントリにアクセスします。
putAll メソッドは、指定したマップのエントリ セット反復子によってキーと値のマッピングが提供される順序で、指定されたマップ内のマッピングごとに 1 つのエントリ アクセスを生成します。 他のメソッドはエントリ アクセスを生成しません。 反転ビューでこれらのメソッドを呼び出すと、バッキング マップ上のエントリへのアクセスが生成されます。 逆のビューでは、エントリへのアクセスによって最初に開始順に移動されることに注意してください。
putFirstやlastEntryなどの明示的な配置メソッドは、マップ上でも逆順ビューでも、配置操作を実行し、エントリ アクセスを生成しません。
keySet、values、およびentrySetビューに対する操作、またはシーケンス化されたビューに対する操作は、バッキング マップの検出順序には影響しません。
新しいマッピングがマップに追加されたときに、古いマッピングを自動的に削除するためのポリシーを適用するために、 #removeEldestEntry(Map.Entry) メソッドをオーバーライドできます。 または、"eldest" エントリが最初に出現する順序であるため、プログラムは、 #firstEntry firstEntry メソッドと #pollFirstEntry pollFirstEntry メソッドを使用して古いマッピングを検査および削除できます。
このクラスは、省略可能なすべての Map および SequencedMap 操作を提供し、null 要素を許可します。
HashMapと同様に、ハッシュ関数がバケット間で要素を適切に分散すると仮定すると、基本操作 (add、contains、remove) に対して一定時間のパフォーマンスが提供されます。 リンクリストを維持するコストが追加されたため、パフォーマンスは HashMapのわずかに下回る可能性があります。ただし、1 つの例外があります。 LinkedHashMap のコレクション ビューを反復処理するには、その容量に関係なく、マップの サイズ に比例した時間が必要です。
HashMapの繰り返しはコストが高くなる可能性が高く、容量に比例した時間が必要です。
リンクされたハッシュ マップには、そのパフォーマンスに影響を与える 2 つのパラメーター ( 初期容量 と 読み込み係数) があります。 これらは、 HashMapと同じように正確に定義されます。 ただし、このクラスの反復時間は容量の影響を受けないため、初期容量に対して過度に高い値を選択した場合のペナルティは、 HashMapよりも低くなります。
<strong>この実装が同期されていないことを確認します。</strong> 複数のスレッドがリンクされたハッシュ マップに同時にアクセスし、少なくとも 1 つのスレッドがマップを構造的に変更する場合は、外部で同期 <em>must</em> 。 これは通常、マップを自然にカプセル化するオブジェクトを同期することによって実現されます。
このようなオブジェクトが存在しない場合は、 Collections#synchronizedMap Collections.synchronizedMap メソッドを使用してマップを "ラップ" する必要があります。 これは、マップへの誤った同期されていないアクセスを防ぐために、作成時に行うのが最善です。
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
構造の変更とは、1 つ以上のマッピングを追加または削除する操作、またはアクセス順序のリンクされたハッシュ マップの場合は反復順序に影響を与える操作です。 挿入順序のリンクされたハッシュ マップでは、マップに既に含まれているキーに関連付けられている値を変更するだけでは、構造上の変更ではありません。
<strong>アクセス順のリンクされたハッシュ マップでは、 get を使用してマップに対してクエリを実行するだけで、構造が変更されます。
</strong>)
このクラスのすべてのコレクション ビュー メソッドによって返されるコレクションの iterator メソッドによって返される反復子は、 <em>fail-fast</em>: 反復子の作成後にいつでもマップが構造的に変更された場合、反復子の独自の remove メソッドを除き、反復子は ConcurrentModificationExceptionをスローします。 したがって、同時変更が発生した場合、反復子は、将来不確定な時点で任意の非決定論的な動作を危険にさらすのではなく、迅速かつクリーンに失敗します。
反復子のフェイルファスト動作は、一般的に言えば、非同期の同時変更が存在する場合にハード保証することは不可能であるため、保証できないことに注意してください。 フェイルファスト反復子は、ベスト エフォートベースで ConcurrentModificationException をスローします。 したがって、正しさのためにこの例外に依存するプログラムを記述するのは間違っています。 反復子のフェイルファスト動作はバグを検出するためにのみ使用する必要があります。
このクラスのすべてのコレクション ビュー メソッドによって返されるコレクションの分割子メソッドによって返される分割子は、 <em>late-binding</em>、 <em>fail-fast</em>、さらに Spliterator#ORDEREDを報告します。
<em>Note</em>: Android Nougat (API レベル 24 および 25) でのこれらの分割子の実装では、 Spliterator#ORDEREDを報告するにもかかわらず、間違った順序 (正しい順序を使用する反復子と矛盾) が使用されます。 API レベル 24 と 25 で正しく順序付けられた Spliterator を取得するには、次のコード フラグメントを使用できます。<ul><li>コレクション ビューc = lhm.keySet()、c = lhm.entrySet()、またはc = lhm.values()の場合は、java.util.Spliterators.spliterator(c, c.spliterator().characteristics())の代わりにc.spliterator()を使用します。
<li>c.stream()またはc.parallelStream()の代わりに、java.util.stream.StreamSupport.stream(spliterator, false)を使用して、このようなjava.util.stream.Streamから (非パラメーター) Spliteratorを構築します。
</ul> これらの回避策は、 lhm が LinkedHashMapである場合にのみ推奨されることに注意してください。
このクラスは、Java Collections Framework のメンバーです。
1.4 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
| 名前 | 説明 |
|---|---|
| LinkedHashMap() |
既定の初期容量 (16) と読み込み係数 (0) を使用して、空の挿入順序付き |
| LinkedHashMap(IDictionary) |
指定したマップと同じマッピングを使用して、挿入順の |
| LinkedHashMap(Int32, Single, Boolean) |
指定した初期容量、負荷係数、および順序モードを使用して、空の |
| LinkedHashMap(Int32, Single) |
指定した初期容量と読み込み係数を使用して、空の挿入順序付き |
| LinkedHashMap(Int32) |
指定した初期容量と既定の読み込み係数 (0) を使用して、空の挿入順序付き |
| LinkedHashMap(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
| 名前 | 説明 |
|---|---|
| Class |
この |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| IsEmpty |
追加する (継承元 AbstractMap) |
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniManagedPeerState |
明確に定義された検出順序を持つ、 |
| JniPeerMembers |
明確に定義された検出順序を持つ、 |
| PeerReference |
このJava ピアの JNI オブジェクト参照を取得します。 (継承元 Object) |
| ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
| ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
メソッド
| 名前 | 説明 |
|---|---|
| Clear() |
追加する (継承元 AbstractMap) |
| Clone() |
この |
| Compute(Object, IBiFunction) |
明確に定義された検出順序を持つ、 |
| ComputeIfAbsent(Object, IFunction) |
明確に定義された検出順序を持つ、 |
| ComputeIfPresent(Object, IBiFunction) |
明確に定義された検出順序を持つ、 |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
明確に定義された検出順序を持つ、 |
| ContainsKey(Object) |
追加する (継承元 AbstractMap) |
| ContainsValue(Object) |
追加する (継承元 AbstractMap) |
| Dispose() |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| Dispose(Boolean) |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| DisposeUnlessReferenced() |
明確に定義された検出順序を持つ、 |
| EntrySet() |
このマップに含まれるマッピングの |
| Equals(Object) |
明確に定義された検出順序を持つ、 |
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| ForEach(IBiConsumer) |
明確に定義された検出順序を持つ、 |
| Get(Object) |
追加する (継承元 AbstractMap) |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| GetOrDefault(Object, Object) |
明確に定義された検出順序を持つ、 |
| JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| KeySet() |
追加する (継承元 AbstractMap) |
| Merge(Object, Object, IBiFunction) |
明確に定義された検出順序を持つ、 |
| NewLinkedHashMap(Int32) |
明確に定義された検出順序を持つ、 |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| Put(Object, Object) |
追加する (継承元 AbstractMap) |
| PutAll(IDictionary) |
追加する (継承元 AbstractMap) |
| PutFirst(Object, Object) |
追加する |
| PutIfAbsent(Object, Object) |
明確に定義された検出順序を持つ、 |
| PutLast(Object, Object) |
追加する |
| Remove(Object, Object) |
指定したキーのマッピングが存在する場合は、このマップから削除します。 (継承元 HashMap) |
| Remove(Object) |
追加する (継承元 AbstractMap) |
| RemoveEldestEntry(IMapEntry) |
このマップが最も長いエントリを削除する必要がある場合は、 |
| Replace(Object, Object, Object) |
明確に定義された検出順序を持つ、 |
| Replace(Object, Object) |
明確に定義された検出順序を持つ、 |
| ReplaceAll(IBiFunction) |
明確に定義された検出順序を持つ、 |
| Reversed() |
明確に定義された検出順序を持つ、 |
| SequencedEntrySet() |
明確に定義された検出順序を持つ、 |
| SequencedKeySet() |
明確に定義された検出順序を持つ、 |
| SequencedValues() |
明確に定義された検出順序を持つ、 |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
明確に定義された検出順序を持つ、 |
| Size() |
追加する (継承元 AbstractMap) |
| ToArray<T>() |
このJava配列ラッパーからマネージド配列を作成します。 (継承元 Object) |
| ToString() |
オブジェクトの文字列表現を返します。 (継承元 Object) |
| UnregisterFromRuntime() |
相互運用ランタイムからこのJava ピアの登録を解除します。 (継承元 Object) |
| Values() |
追加する (継承元 AbstractMap) |
| Wait() |
現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。 (継承元 Object) |
| Wait(Int64, Int32) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
| Wait(Int64) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
| 名前 | 説明 |
|---|---|
| IJavaPeerable.Disposed() |
明確に定義された検出順序を持つ、 |
| IJavaPeerable.Finalized() |
明確に定義された検出順序を持つ、 |
| IJavaPeerable.JniObjectReferenceControlBlock |
明確に定義された検出順序を持つ、 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
明確に定義された検出順序を持つ、 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
明確に定義された検出順序を持つ、 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
明確に定義された検出順序を持つ、 |
| IJavaPeerable.UnregisterFromRuntime() |
明確に定義された検出順序を持つ、 |
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
明確に定義された検出順序を持つ、 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|