同僚があるプログラムの実行速度が遅いので困っていました。

プログラムの問題点をすっごく簡単にするとこんな感じ。

public void piyo(List<Hoge> hogeList, List<Fuga> fugaList){
	for(Fuga fuga : fugaList){
		for(Hoge hoge : hogeList){
			if(hoge.getKey().equals(fuga.getKey())){
				something(hoge);
				break;
			}
		}
	}
}

どう見ても二重ループが悪い。

なのでMapを使ったらいいんじゃないの?って提案したんですね。

※Hoge.getKey()はユニークで重複しないInteger型の前提

public void piyo(List<Hoge> hogeList, List<Fuga> fugaList){
	Map<Integer, Hoge> hogeMap = new HashMap<Integer, Hoge>(hogeList.size());
	for(Hoge hoge : hogeList){
		hogeMap.put(hoge.getKey(), hoge);
	}

	for(Fuga fuga : fugaList){
		if(hogeMap.containsKey(fuga.getKey())){
			something(hogeMap.get(fuga.getKey()));
		}
	}
}

無事、性能は改善されました。めでたしめでたし。
って感じでオチもなんもないんだけど、Mapって早いし便利じゃないですか。

性能的に心配ならもっと積極的に使っていってほしいんですけど、
それともなにか私の知らない強烈なデメリットがあったりするのでしょうか。。。

以下、ねんのため検証

public static void main(String[] args) {
	List<Hoge> hogeList = new ArrayList<Hoge>();
	List<Fuga> fugaList = new ArrayList<Fuga>();
	for(int i=0; i < 10000; i++){
		hogeList.add(new Hoge(i+1));
		fugaList.add(new Fuga(10000-i));
	}
	long t = System.currentTimeMillis();
	piyo(hogeList, fugaList);
	System.out.println(System.currentTimeMillis() - t);
}
修正前修正後
1496ms80ms
1439ms69ms
1448ms72ms

うん、やっぱ早いよなあ。