Javaでよく使うMap(Set)のキー(要素)順序の比較

よく忘れるのでまとめておく。

HashMap(HashSet) 速い。キー(要素)の順番は保障されない。
TreeMap(TreeSet) キー(要素)を自然順序付けで保持。コンストラクタに比較用オブジェクトを渡すことも出来る。
LinkedHashMap(LinkedHashSet) キー(要素)を入れた順番のまま保持。

キー(要素)の順番はイテレータを使うときに影響。
以下Mapの場合の例

import java.util.Map;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.TreeMap;

public class MapComparison {
	public static void main(String[] args) {
		putAndPrintNumbers(new HashMap<String, String>());
		putAndPrintNumbers(new LinkedHashMap<String, String>());
		putAndPrintNumbers(new TreeMap<String, String>());
	}

	/**
	 * 受け取ったマップに"key9"から"key0"まで順にキーを入れたあと出力。
	 * 
	 * @param map 空のマップ
	 */
	public static void putAndPrintNumbers(Map<String, String> map) {
		for (int j = 0; j < 10; j++) {
			map.put("key" + (9 - j), "value");
		}
		System.out.println(map.getClass().getName());
		for (String key : map.keySet()) {
			System.out.print(key + ",");
		}
		System.out.println();
	}
}

実行結果

java.util.HashMap
key4,key3,key6,key5,key0,key2,key1,key8,key7,key9, // バラバラ
java.util.LinkedHashMap
key9,key8,key7,key6,key5,key4,key3,key2,key1,key0, // 入れた順
java.util.TreeMap
key0,key1,key2,key3,key4,key5,key6,key7,key8,key9, // 辞書順