public static void reverseArray(int[] arr) {
int[] reversed = new int[arr.length];
for (int i = arr.length - 1; i > -1; --i) {
reversed[arr.length - i - 1] = arr[i];
}
arr = reversed;
}
Здесь у меня есть метод обратного массива. Если я называюКопирование Java-массива и копирование 2D-массива Confused
int[] v = new int[] {1, 2, 3, 4};
reverseArray(v);
//print v
Я хотел бы получить "1 2 3 4"
Но если я изменил функцию reverseArray на
public static void reverseArray(int[] arr) {
int[] reversed = new int[arr.length];
for (int i = arr.length - 1; i > -1; --i) {
reversed[arr.length - i - 1] = arr[i];
}
for (int i = 0; i < arr.length; ++i) {
arr[i] = reversed[i];
}
}
Он будет работать как задумано и распечатать «4 3 2 1 «Почему не« arr = обратный »; Работа? Они оба указателя, поэтому, если я назначаю их другим, он должен указывать на те же объекты, что и на 2D-массивы. Если я сделаю
int[][] mat = //some assignment
public void reverseMatrix() {
reverseAllRows();
int[][] c = new int[mat.length][mat[0].length];
for (int i = 0; i < mat.length; ++i) {
c[mat.length - 1 - i] = mat[i];
}
mat = c; //This works for some reason
}
Это работает без необходимости копировать каждый из элементов. Почему это и как я узнаю, когда это нужно, чтобы использовать равные, а когда нет?
Ваша проблема в том, что Java выполняет «pass by value». Это означает, что присвоение «arr = обратное» просто не имеет эффекта вне сферы действия этого метода. Код, вызывающий обратный метод, делает ** не ** видеть новый, обратный массив. Вам когда-либо приходилось напрямую изменять элементы предоставленного массива; или вам нужно вернуть обратный массив. – GhostCat
Да, но почему это сработало для 2D-массива? – user2180617
Потому что для 2D-массива вы делаете что-то другое. Там ваш метод не работает на входном параметре, а в поле класса-класса! – GhostCat