概要
- Map インターフェースの実装としてよく使われている HashMap クラスは順序付けを何も保証していない
- SortedMap インターフェースはキーの順序付けを提供する
- TreeMap クラスは SortedMap インターフェースを実装しているため、キーによる順序付けが行われる
- TreeMap クラスを使うとキーの昇順に自動でソートされる
HashMap クラス
HashMap は何もソートしない。
HashMap (Java SE 11 & JDK 11 )
このクラスはマップの順序を保証しません。特に、その順序を常に一定に保つことを保証しません。
SortedMap インターフェース
SortedMap はキーによるソートを実現する。
entrySet、keySet、values メソッドで返されるキーや値は、キーの順序付けに従ってソートされている。
SortedMap (Java SE 11 & JDK 11 )
そのキーに対して全体順序付けを提供するMapです。 マップの順序付けは、キーの自然順序付けに従って行われるか、ソート・マップ構築時に通常提供されるComparatorを使って行われます。 この順序は、ソート・マップのコレクション・ビュー(entrySet、keySet、valuesメソッドによって返される)の反復処理時に反映されます。 その順序付けを利用するために、追加のオペレーションがいくつか提供されています。 (このインタフェースはマップで、SortedSetに類似しています。)
TreeMap クラス
TreeMap は SortedMap インターフェースを実装しているため、キーによるソートが行われる。
TreeMap (Java SE 11 & JDK 11 )
赤 - 黒ツリーに基づくNavigableMap実装です。 マップは、使用するコンストラクタに応じて、そのキーの自然順序付けに従って、またはマップ作成時に提供されるComparatorによってソートされます。
サンプルコード
HashMap と TreeMap の挙動を確認するソースコード。
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Sample {
public static void main(String[] args) {
// HashMap を構築
// 順番は保証されない
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("0001", "Alice");
hashMap.put("0002", "Bob");
hashMap.put("0003", "Carol");
hashMap.put("0004", "Dave");
hashMap.put("0005", "Ellen");
System.out.println("HashMap");
for (String key : hashMap.keySet()) {
System.out.println(key + ": " + hashMap.get(key));
}
System.out.println();
// TreeMap を構築
// キーの昇順に自動でソートしてくれる
Map<String, String> treeMap = new TreeMap<String, String>(hashMap);
System.out.println("TreeMap");
for (String key : treeMap.keySet()) {
System.out.println(key + ": " + treeMap.get(key));
}
System.out.println();
// TreeMap に値を追加するとキーの昇順に自動でソートしてくれる
treeMap.put("0000", "XXXXX");
System.out.println("TreeMap");
for (String key : treeMap.keySet()) {
System.out.println(key + ": " + treeMap.get(key));
}
System.out.println();
}
}
実行結果。
HashMap は何もソートされない。
TreeMap はキーの昇順でソートされている。
HashMap
0004: Dave
0005: Ellen
0002: Bob
0003: Carol
0001: Alice
TreeMap
0001: Alice
0002: Bob
0003: Carol
0004: Dave
0005: Ellen
TreeMap
0000: XXXXX
0001: Alice
0002: Bob
0003: Carol
0004: Dave
0005: Ellen
今回の環境
$ java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)