Java: проблема модификации значений элементов двойного массива экземпляра - PullRequest
4 голосов
/ 03 апреля 2020

Я новичок в Java. У меня есть класс, для которого могут быть созданы экземпляры. Внутри класса я определяю две переменные экземпляра:

double[] array1;

double[] array2;

Массивы будут одинаковой длины.

Внутри класса Затем у меня есть метод1, который сначала заполняет array1, а затем другой метод2, в котором я хочу установить некоторые из значений array2 = значения в массиве 1 (на основе индекса элемента массива), но затем изменить (выполнить дополнительную операцию) некоторые значения в массиве 2 (на основе индекса элемента массива). Я попытался сделать это в method2, сначала установив:

array2 = array1;

, а затем изменив некоторые из значений array2 на основе индекса элемента, но я вижу, что array1 был полностью изменен на равный массив2, так что понимай, что с моим подходом в Java.

что-то принципиально не так

Ответы [ 5 ]

5 голосов
/ 03 апреля 2020

Массивы в Java являются объектами, а переменные содержат только ссылки.
Таким образом * array1 = array2 только назначает ссылку array2 на переменную array1 и не копирует содержимое ...

3 голосов
/ 03 апреля 2020

Вместо использования присваивания с массивом1 для установки массива2, вам, вероятно, следует использовать Arrays.copyOf ():

array2 = Arrays.copyOf(array1, array1.length);

Надеюсь, это поможет

3 голосов
/ 03 апреля 2020

Назначение array2 = array1 устанавливает array2 для указания на массив как array1. Всякий раз, когда вы изменяете массив (например, array[0] = 123), обе переменные «видят» изменение, так как они обе указывают на один и тот же массив. Если вы хотите скопировать элементы массива, вам придется делать это, перебирая массив и присваивая ему значения (или используя вспомогательный метод, который делает именно это, например, Arrays.copyOf). Например:

// Assumption: Both arrays are initialized and array1.length = array2.length

for (int i = 0; i < array1.length; ++i) {
    array2[i] = array1[i];
    // some additional logic on array2[i]
}
2 голосов
/ 03 апреля 2020

array2 = array1; указывает array2 ссылка на тот же экземпляр, на который ссылается array1, что означает, что если вы измените значение, используя любую из этих ссылок, значение, доступное с помощью другой, будет таким же.

Сделайте это как

array2 = array1.clone();

Он назначит копию экземпляра, на которую ссылаются array1, array2.

Демонстрация:

public class Main {
    public static void main(String[] args) {
        int[] x = { 1, 2, 3 };
        int[] y = x.clone();
        x[2] = 5;
        System.out.println(x[2]);
        System.out.println(y[2]);
    }
}

Выход:

5
3
2 голосов
/ 03 апреля 2020

Делая array2=array1, вы добавляете ссылку array2 к array1. Поэтому всякий раз, когда вы вносите изменения в array2, в силу ссылки, array1 также будет меняться. Поэтому вам необходимо скопировать значения из одного массива в другой и не передавать ссылку из одного массива в другой.

Если вам нужен однострочный ответ

System.arrayCopy(arrayA, 0, arrayB, 0, arrayB.length);
...