Jestem nowy w Javie. Mam klasę, dla której można tworzyć instancje. W ramach klasy definiuję dwie zmienne instancji:

double[] array1;

double[] array2;

Tablice będą miały taką samą długość.

W klasie mam wtedy metodę method1, która najpierw wypełnia array1, a następnie inną metodę2, w której chcę ustawić niektóre z array2 wartości = wartości w tablicy1 (na podstawie indeksu elementu tablicy), ale także modyfikuje (wykonuje dodatkową operację na) niektórych wartości w tablica2 (na podstawie indeksu elementu tablicy). Próbowałem to zrobić w Method2, ustawiając najpierw:

array2 = array1;

A następnie modyfikując niektóre wartości array2 na podstawie indeksu elementu, ale widzę, że tablica tablica1 została całkowicie zmodyfikowana do równej tablicy2, więc zdaj sobie sprawę, że jest coś zasadniczo nie tak z moim podejściem w Javie.

4
2one 3 kwiecień 2020, 12:32

5 odpowiedzi

Najlepsza odpowiedź

Zamiast używać przypisania z tablicą tablica1 do ustawiania tablicy2, prawdopodobnie powinieneś użyć Arrays.copyOf ():

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

Mam nadzieję, że to pomoże

3
Sam 3 kwiecień 2020, 09:38

Tablice w Java są obiektami, a zmienne zawierają tylko odniesienia.
Zatem array1 = array2 przypisuje tylko odniesienie array2 do zmiennej array1 i nie kopiuje zawartości ...

5
Usagi Miyamoto 3 kwiecień 2020, 09:42

Przypisanie array2 = array1 ustawia array2, aby wskazywały na tablicę jako array1. Za każdym razem, gdy modyfikujesz tablicę (np. array[0] = 123), obie zmienne „zobaczą” zmianę, ponieważ obie wskazują na tę samą tablicę. Jeśli chcesz skopiować elementy tablicy, musisz to zrobić, wykonując iterację po tablicy i przypisując do niej wartości (lub użyj metody pomocniczej, która to robi, na przykład Arrays.copyOf). Na przykład.:

// 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]
}
3
Mureinik 3 kwiecień 2020, 09:37

array2 = array1; wskazuje array2 odwołanie do tej samej instancji, do której odwołuje się array1, co oznacza, że jeśli zmienisz wartość za pomocą jednego z tych odniesień, wartość uzyskana przy użyciu drugiego będzie podobnie.

Zrób to jako

array2 = array1.clone();

Przydzieli kopię instancji, do której odwołuje się array1 do array2.

Demo:

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]);
    }
}

Wynik:

5
3
2
Arvind Kumar Avinash 3 kwiecień 2020, 09:54

Wykonując array2=array1, dodajesz odniesienie array2 do array1. Zatem ilekroć wprowadzisz zmiany w array2, na mocy odniesienia, array1 również się zmieni. Dlatego musisz skopiować wartości z jednej tablicy do drugiej i nie przekazywać referencji z jednej tablicy do drugiej.

Jeśli chcesz odpowiedzi na jedną linijkę

System.arrayCopy(arrayA, 0, arrayB, 0, arrayB.length);
2
Ayman Arif 3 kwiecień 2020, 09:57