記憶庫

自分用のメモです。

Map クラスがキーを保持する順序について

Map インタフェースの実装クラスである LinkedHashMap、TreeMap、HashMap がキーを保持する順序はそれぞれ以下の通りである。

LinkedHashMap:
キーを格納した順に保持。
TreeMap:
キーの昇順に保持。
HashMap:
順序を保持しない。

上記を実際にプログラムを作成して検証する。
まずは、以下のようなクラスを作成。

class MapLabo {
	
	MapLabo(Map<String, String> aMap) {
		this.map = aMap;
		return;
	}
	
	void putValue() {
		
		this.map.put("3", "みかん");
		this.map.put("1", "いちご");
		this.map.put("2", "りんご");
		this.map.put("6", "ぶどう");
		this.map.put("4", "だいこん?");
		this.map.put("5", "ばなな");
		
		return;
	}
	
	void dump() {
		
		System.out.println(this.map.getClass().getName() + " の内容:");
		
		Iterator<String> _ite = this.map.keySet().iterator();
		
		while (_ite.hasNext()) {
			String _key = _ite.next();
			System.out.println(_key + " :[" + this.map.get(_key) + "]");
		}
		
		System.out.println();
		
		return;
	}
	
	void experiment() {
		this.putValue();
		this.dump();
		return;
	}
	
	//*** メンバ変数
	private Map<String, String> map;
}


上記クラスは、コンストラクタにて Map クラスのインスタンスを受け取り、そのインスタンスに対して putValue() メソッドにてキーおよび値の追加を行い、dump() メソッドにてキーと値の組み合わせを標準出力に表示する。


呼び出す方法は以下の通り。

new MapLabo(new LinkedHashMap<String, String>()).experiment();
new MapLabo(new TreeMap<String, String>()).experiment();
new MapLabo(new HashMap<String, String>()).experiment();


実行結果は以下の通り。

java.util.LinkedHashMap の内容:
3 :[みかん]
1 :[いちご]
2 :[りんご]
6 :[ぶどう]
4 :[だいこん?]
5 :[ばなな]

java.util.TreeMap の内容:
1 :[いちご]
2 :[りんご]
3 :[みかん]
4 :[だいこん?]
5 :[ばなな]
6 :[ぶどう]

java.util.HashMap の内容:
3 :[みかん]
2 :[りんご]
1 :[いちご]
6 :[ぶどう]
5 :[ばなな]
4 :[だいこん?]


LinkedHashMap は格納した順番にキーを保持している。
TreeMap は昇順にキーを保持している。
HashMap の順序は不定であり、実行するたびに出力順序が異なる。