public class Demo1 {
public static void main(String[] args) {
int arr[] = {2, 3, 4};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int arr[]) {
int arr1[] = {0, 3, 4};
arr = Arrays.copyOfRange(arr1, 0, arr1.length);
}
}
出力結果:[2, 3, 4]
このコードでは、sort メソッドを呼び出して arr を変更し、変更後の結果を出力することを期待しています。しかし、出力結果は依然として元の配列 [2, 3, 4] です。
これは、Java では、配列を sort メソッドに渡すと、実際には配列の参照(メモリアドレス)がメソッドに渡されるためです。sort メソッド内部では、arr に新しい配列 arr1 への参照を代入していますが、これは main メソッド内の元の配列には影響しません。
解決策:#
- 参照が指す配列を直接変更する
public class Demo1 {
public static void main(String[] args) {
int arr[] = {2, 3, 4};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int arr[]) {
// sortメソッド内でarr配列を直接変更する
arr[0] = 0;
arr[1] = 3;
arr[2] = 4;
}
}
- sort の戻り値を int [] に変更し、main メソッドで変更する
public class Demo1 {
public static void main(String[] args) {
int arr[] = {2, 3, 4};
arr = sort(arr);
System.out.println(Arrays.toString(arr));
}
public static int[] sort(int arr[]) {
int arr1[] = {0, 3, 4};
return Arrays.copyOfRange(arr1, 0, arr1.length);
}
}