Java : LinkedHashMap (順序を保持するマップ) - API使用例
LinkedHashMap (Java SE 23 & JDK 23) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
APIドキュメントのおともにどうぞ。
概要
Mapインタフェースのハッシュ表およびリンク・リスト実装。検出順序は明確に定義されています。 この実装は、HashMapとは異なります。これは、すべてのエントリを経由して実行される二重リンク・リストを保持する点です。
LinkedHashMap は、ハッシュ表とリンク・リストによる Map の実装です。
リンク・リストを持っているので、要素を追加した順序を保持します。
関連記事:Map(マップ)の基本
final var map = new LinkedHashMap<String, Integer>();
System.out.println(map); // {}
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
System.out.println(map.get("a")); // 10
System.out.println(map.get("b")); // 20
System.out.println(map.get("X")); // null
map.remove("b");
System.out.println(map); // {a=10, c=30}
final var linkedHashMap = new LinkedHashMap<String, Integer>();
linkedHashMap.put("xxx", 10);
linkedHashMap.put("yyy", 20);
linkedHashMap.put("aaa", 30);
linkedHashMap.put("bbb", 40);
System.out.println(linkedHashMap); // {xxx=10, yyy=20, aaa=30, bbb=40}
final var hashMap = new HashMap<String, Integer>();
hashMap.put("xxx", 10);
hashMap.put("yyy", 20);
hashMap.put("aaa", 30);
hashMap.put("bbb", 40);
System.out.println(hashMap); // {aaa=30, bbb=40, yyy=20, xxx=10}
コンストラクタ
LinkedHashMap ()
デフォルトの初期容量(16)および負荷係数(0.75)を使用して、空の挿入順序のLinkedHashMapインスタンスを作成します。
final var map = new LinkedHashMap<String, Integer>();
System.out.println(map); // {}
System.out.println(map.isEmpty()); // true
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
System.out.println(map.size()); // 3
LinkedHashMap (int initialCapacity)
指定された初期容量およびデフォルトのロード・ファクタ(0.75)を使用して、挿入順序の空のLinkedHashMapインスタンスを作成します。
初期容量を変えて処理時間を計った例です。
(実行する環境によって変わる可能性があります)
final var map = new LinkedHashMap<String, Integer>(10000000);
System.out.println(map); // {}
final var startTime = System.nanoTime();
for (int i = 0; i < 1000000; i++) {
map.put(String.valueOf(i), i);
}
final var endTime = System.nanoTime();
// 0.076968 sec.
System.out.printf("%f sec.%n", (endTime - startTime) / 1000000000.0);
final var map = new LinkedHashMap<String, Integer>(1);
System.out.println(map); // {}
final var startTime = System.nanoTime();
for (int i = 0; i < 1000000; i++) {
map.put(String.valueOf(i), i);
}
final var endTime = System.nanoTime();
// 0.119630 sec.
System.out.printf("%f sec.%n", (endTime - startTime) / 1000000000.0);
LinkedHashMap (int initialCapacity, float loadFactor)
指定された初期容量と負荷係数を持つ空の挿入順序のLinkedHashMapインスタンスを構築します。
負荷係数を変えて処理時間を計った例です。
(実行する環境によって変わる可能性があります)
final var map = new LinkedHashMap<String, Integer>(16, 0.05f);
System.out.println(map); // {}
final var startTime = System.nanoTime();
for (int i = 0; i < 1000000; i++) {
map.put(String.valueOf(i), i);
}
final var endTime = System.nanoTime();
// 0.160612 sec.
System.out.printf("%f sec.%n", (endTime - startTime) / 1000000000.0);
final var map = new LinkedHashMap<String, Integer>(16, 0.75f);
System.out.println(map); // {}
final var startTime = System.nanoTime();
for (int i = 0; i < 1000000; i++) {
map.put(String.valueOf(i), i);
}
final var endTime = System.nanoTime();
// 0.117338 sec.
System.out.printf("%f sec.%n", (endTime - startTime) / 1000000000.0);
LinkedHashMap (int initialCapacity, float loadFactor, boolean accessOrder)
指定された初期容量、負荷係数および順序付けモードで空のLinkedHashMapインスタンスを構築します。
// accessOrder = false
final var map = new LinkedHashMap<String, Integer>(16, 0.75f, false);
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
System.out.println(map.get("a")); // 10
System.out.println(map); // {a=10, b=20, c=30}
System.out.println(map.get("b")); // 20
System.out.println(map); // {a=10, b=20, c=30}
// accessOrder = true
final var map = new LinkedHashMap<String, Integer>(16, 0.75f, true);
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
System.out.println(map.get("a")); // 10
System.out.println(map); // {b=20, c=30, a=10}
System.out.println(map.get("b")); // 20
System.out.println(map); // {c=30, a=10, b=20}
LinkedHashMap (Map<? extends K,? extends V> m)
指定したマップと同じマッピングを使用して、挿入順序のLinkedHashMapインスタンスを構築します。
final var m = Map.of("a", 10, "b", 20, "c", 30);
System.out.println(m); // {b=20, a=10, c=30}
final var map = new LinkedHashMap<>(m);
System.out.println(map); // {b=20, a=10, c=30}
System.out.println(map.size()); // 3
メソッド
void clear ()
すべてのマッピングをマップから削除します。
final var map = new LinkedHashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
System.out.println(map); // {a=1, b=2, c=3}
System.out.println(map.size()); // 3
map.clear();
System.out.println(map); // {}
System.out.println(map.size()); // 0
boolean containsValue (Object value)
このマップが1つまたは複数のキーと指定された値をマッピングしている場合にtrueを返します。
final var map = new LinkedHashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("X", 3);
System.out.println(map); // {a=1, b=2, c=3, X=3}
System.out.println(map.containsValue(0)); // false
System.out.println(map.containsValue(1)); // true
System.out.println(map.containsValue(2)); // true
System.out.println(map.containsValue(3)); // true
System.out.println(map.containsValue(4)); // false
Set<Map.Entry<K,V>> entrySet ()
このマップに含まれるマッピングのSetビューを返します。
final var map = new LinkedHashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
System.out.println(map); // {a=1, b=2, c=3}
final var entries = map.entrySet();
System.out.println(entries); // [a=1, b=2, c=3]
map.replace("b", 20);
System.out.println(map); // {a=1, b=20, c=3}
System.out.println(entries); // [a=1, b=20, c=3]
entries.remove(Map.entry("a", 1));
System.out.println(map); // {b=20, c=3}
System.out.println(entries); // [b=20, c=3]
for (final var entry : entries) {
entry.setValue(entry.getValue() * 10);
}
System.out.println(map); // {b=200, c=30}
System.out.println(entries); // [b=200, c=30]
V get (Object key)
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。
final var map = new LinkedHashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
System.out.println(map); // {a=1, b=2, c=3}
System.out.println(map.get("a")); // 1
System.out.println(map.get("b")); // 2
System.out.println(map.get("c")); // 3
System.out.println(map.get("X")); // null
System.out.println(map.get("")); // null
Set<K> keySet ()
このマップに含まれるキーのSetビューを返します。
final var map = new LinkedHashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
System.out.println(map); // {a=1, b=2, c=3}
final var keys = map.keySet();
System.out.println(keys); // [a, b, c]
map.put("d", 4);
System.out.println(map); // {a=1, b=2, c=3, d=4}
System.out.println(keys); // [a, b, c, d]
keys.remove("a");
System.out.println(map); // {b=2, c=3, d=4}
System.out.println(keys); // [b, c, d]
static <K, V> LinkedHashMap<K,V> newLinkedHashMap (int numMappings)
予想されるマッピング数に適した、新しい空の挿入順序のLinkedHashMapを作成します。
final var map = LinkedHashMap.<String, Integer>newLinkedHashMap(3);
System.out.println(map); // {}
System.out.println(map.isEmpty()); // true
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
System.out.println(map.size()); // 3
V putFirst (K k, V v)
指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。
final var map = new LinkedHashMap<>();
map.putFirst("a", 10);
System.out.println(map); // {a=10}
map.putFirst("b", 20);
System.out.println(map); // {b=20, a=10}
map.putFirst("c", 30);
System.out.println(map); // {c=30, b=20, a=10}
V putLast (K k, V v)
指定されたマッピングがまだ存在しない場合はマップに挿入し、すでに存在する場合はマッピングの値を置換します (オプションの操作)。
final var map = new LinkedHashMap<>();
map.putLast("a", 10);
System.out.println(map); // {a=10}
map.putLast("b", 20);
System.out.println(map); // {a=10, b=20}
map.putLast("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
protected boolean removeEldestEntry (Map.Entry<K,V> eldest)
このマップが最長のエントリを削除する必要がある場合、trueを返します。
@SuppressWarnings("serial")
class MyMap extends LinkedHashMap<String, Integer> {
private static final int MAX_ENTRIES = 3;
@Override
protected boolean removeEldestEntry(Map.Entry<String, Integer> eldest) {
System.out.println("removeEldestEntry eldest : " + eldest);
return size() > MAX_ENTRIES;
}
}
final var map = new MyMap();
System.out.println("-- put a --");
map.put("a", 10);
System.out.println("map : " + map);
System.out.println("-- put b --");
map.put("b", 20);
System.out.println("map : " + map);
System.out.println("-- put c --");
map.put("c", 30);
System.out.println("map : " + map);
System.out.println("-- put d --");
map.put("d", 40);
System.out.println("map : " + map);
System.out.println("-- put e --");
map.put("e", 50);
System.out.println("map : " + map);
// 結果
// ↓
//-- put a --
//removeEldestEntry eldest : a=10
//map : {a=10}
//-- put b --
//removeEldestEntry eldest : a=10
//map : {a=10, b=20}
//-- put c --
//removeEldestEntry eldest : a=10
//map : {a=10, b=20, c=30}
//-- put d --
//removeEldestEntry eldest : a=10
//map : {b=20, c=30, d=40}
//-- put e --
//removeEldestEntry eldest : b=20
//map : {c=30, d=40, e=50}
SequencedMap<K,V> reversed ()
このマップの逆順viewを返します。
final var map = new LinkedHashMap<>();
map.putLast("a", 10);
map.putLast("b", 20);
map.putLast("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
final var reversedMap = map.reversed();
System.out.println(reversedMap); // {c=30, b=20, a=10}
System.out.println(reversedMap.reversed()); // {a=10, b=20, c=30}
SequencedSet<Map.Entry<K,V>> sequencedEntrySet ()
このマップのentrySetのSequencedSetビューを返します。
final var map = new LinkedHashMap<>();
map.putLast("a", 10);
map.putLast("b", 20);
map.putLast("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
final var entries = map.sequencedEntrySet();
System.out.println(entries); // [a=10, b=20, c=30]
System.out.println(entries.reversed()); // [c=30, b=20, a=10]
SequencedSet<K> sequencedKeySet ()
このマップのkeySetのSequencedSetビューを返します。
final var map = new LinkedHashMap<>();
map.putLast("a", 10);
map.putLast("b", 20);
map.putLast("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
final var keys = map.sequencedKeySet();
System.out.println(keys); // [a, b, c]
System.out.println(keys.reversed()); // [c, b, a]
SequencedCollection<V> sequencedValues ()
このマップのvaluesコレクションのSequencedCollectionビューを返します。
final var map = new LinkedHashMap<>();
map.putLast("a", 10);
map.putLast("b", 20);
map.putLast("c", 30);
System.out.println(map); // {a=10, b=20, c=30}
final var values = map.sequencedValues();
System.out.println(values); // [10, 20, 30]
System.out.println(values.reversed()); // [30, 20, 10]
Collection<V> values ()
このマップに含まれる値のCollectionビューを返します。
final var map = new LinkedHashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
System.out.println(map); // {a=1, b=2, c=3}
final var values = map.values();
System.out.println(values); // [1, 2, 3]
map.replace("b", 20);
System.out.println(map); // {a=1, b=20, c=3}
System.out.println(values); // [1, 20, 3]
values.remove(1);
System.out.println(map); // {b=20, c=3}
System.out.println(values); // [20, 3]
//values.add(4); // UnsupportedOperationException
HashMapで宣言されたメソッド
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, newHashMap, put, putAll, remove, size
「Java API 使用例 : HashMap」をご参照ください。
AbstractMapで宣言されたメソッド
equals, hashCode, toString
「Java API 使用例 : AbstractMap」をご参照ください。
Mapで宣言されたメソッド
compute, computeIfAbsent, computeIfPresent, containsKey, equals, forEach, getOrDefault, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size
「Java API 使用例 : Map」をご参照ください。
SequencedMapで宣言されたメソッド
firstEntry, lastEntry, pollFirstEntry, pollLastEntry
「Java API 使用例 : SequencedMap」をご参照ください。
関連記事
- List(リスト)の基本
- Map(マップ)の基本
- Set(セット)の基本
- List の初期化方法いろいろ
- Map の初期化方法いろいろ
- Set の初期化方法いろいろ
- 配列 vs. List
- 配列からListへの変換
- List から配列への変換
- API 使用例
- Collection (コレクション)
- Collections (コレクション操作)
- Comparable
- Comparator
- Iterator
- List (リスト)
- Map (マップ)
- Map.Entry (キーと値のペア)
- Queue (キュー)
- AbstractQueue
- ArrayBlockingQueue (ブロッキング・配列キュー)
- ArrayDeque (両端キュー)
- BlockingDeque (ブロッキング・両端キュー)
- BlockingQueue (ブロッキング・キュー)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- Deque (両端キュー)
- LinkedBlockingDeque (ブロッキング・リンク両端キュー)
- LinkedBlockingQueue (ブロッキング・リンクキュー)
- LinkedList (二重リンク・リスト)
- PriorityBlockingQueue (ブロッキング・優先度付きキュー)
- PriorityQueue (優先度付きキュー)
- RandomAccess
- Set (セット)
- Spliterator