参照渡しに気をつけるべし

リストを使ってて,最大値とか,ベスト5とか出したいために一時的にリストをコピーして,そいつをソート書けるなんてことをやる.
たとえば下みたいに


 1
2
3
4
5
6
7
8
9
10

    ArrayList dataList; //データ一覧
・・・ 中略 ・・・
//ベスト5を調べる
ArrayList tmpList = dataList;
Collections.sort(tmpList);

//ベスト5を表示
for(int i = 0; i < 5; i++){
System.out.println(i + "位:" + tmpList.get(i).toString());
}

なんて書くと,tmpListは当然ソートされた状態になってるけど,実はこのとき元のdataListもソートされてしまってる…(汗)
つまり,4行目の代入は参照渡になるので,5行目でソートしたときは参照元(tmpList)だけでなく参照先(dataList)もソートされてしまうというわけ.ま,超初歩的と言ってしまえばそれまでだけど.

で,どーするかって話ですが,4行目を安直に

ArrayList tmpList = (ArrayList)dataList.clone();

って書き換えて対応してしまった.これであってるのかな?