配列、リスト操作に関する一部メソッド

勉強しててちょっと分かりづらかったので書く。

まずarraycopy()について。引数が多くてなんだかごちゃごちゃしてるけど、リファレンスを読めばなんてことはない。例外の送出に注意なのと、コピー先に要素が既にあったとしてもエラーにはならず、コピー元の要素で上書きされる。

int[] array1 = {10, 20, 30, 40, 50};
		
// arraycopy()の利用
int[] copy = {60, 70, 80, 90, 100};
// コピー先の要素数を超えて挿入すると実行時エラー(ArrayIndexOutOfBoundsException)
// System.arraycopy(コピー元の配列名, コピー開始位置, コピー先の配列名, コピー反映位置, コピー数)
System.arraycopy(array1, 0, copy, 0, 4);
for(int val: copy) {
	System.out.print(val + " ");
}
// 結果:10 20 30 40 100

分かりづらかったのはasList()。どうも自分はコレクションが絡んでくると脳がフリーズするらしい。

// asList()の利用
// 引数に指定した配列を固定サイズのリストにして返す
String[] array3 = {"tadokoro", "miura", "kimura"};
List<String> arrayList2 = Arrays.asList(array3);
for(String val: arrayList2) {
	System.out.print(val + " ");
}
結果: tadokoro miura kimura 

// asList()で返されたリストは固定サイズなので、add()で要素を追加すると
// 実行時エラー(UnsupportedOperationException)となる
// 解決方法としては、
// 1.ArrayListクラスのコンストラクタにasList()を渡す
List<String> arrayList3 = new ArrayList<>(Arrays.asList(array3));

// 2.asList()の引数に直接要素を指定する
// ただしasList()はList型で返るため、リストの型もList型にしなければならない
// また要素はObject型でなければいけない
// 下記の場合は引数がint型だが、AutoBoxingでInteger型として扱われるのでエラーは出ない
List<Integer> arrayList4 = Arrays.asList(111, 222, 333);
// 下記はint型の配列を直接引数に渡しているため、コンパイルエラーとなる
// int[] array = {111, 222, 333}:
// List<Integer> arrayList = Arrays.asList(array);

今のところ、苦手な分野については一行一行噛み砕きながらコードを写経していくほかないと思われる。