広告

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」をご参照ください。


関連記事

ページの先頭へ