Kopiowanie tablic we właściwy sposób


Natknąłem się na 2 przykłady z moich notatek, które dotyczą kopiowania tablic.
Pierwszy przykład poniżej mówi, że to nie jest sposób na kopiowanie tablicy. Ale kiedy próbowałem uruchomić kod, udało mu się skopiować wszystkie wartości z tablica1 do tablicy2.
int []array1={2,4,6,8,10};
int []array2=array1;
for(int x:array2){
System.out.println(x);
}

Drugi pokazany przykład dotyczył prawidłowego sposobu kopiowania tablicy.
int[] firstArray = {5, 10, 15, 20, 25 };
int[] secondArray = new int[5];
for (int i = 0; i < firstArray.length; i++)
secondArray[i] = firstArray[i];

Moje pytanie brzmi, czy te 2 przykłady nadają się do użycia w kodowaniu, czy też jest to Przykład 2. Gdybyś był moim wykładowcą, użyłbym przykładu 1. Czy dostanę mniej punktów w porównaniu z przykładem 2 metody, czy jest to dokładnie to samo ?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pierwszy przykład niczego nie kopiuje. Przypisuje odwołanie do oryginalnej tablicy do nowej zmiennej (
tablica2
), więc obie zmienne (
tablica1
i
tablica2
) odnoszą się do tej samej tablicy obiekt.
Drugi przykład faktycznie tworzy drugą tablicę i kopiuje do niej zawartość oryginalnej tablicy.
Istnieją inne prostsze sposoby kopiowania tablic. Możesz użyć
Array.Copyof
lub
System.arraycopy
zamiast wyraźnie kopiowania elementów tablicy przez pętlę.
int[] secondArray = Arrays.copyOf (firstArray, firstArray.length);

lub
int[] secondArray = new int[firstArray.length];
System.arraycopy(firstArray, 0, secondArray, 0, firstArray.length);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Idealnym sposobem kopiowania elementów jest
System.arraycopy(array1,0, array2, 0, array1.length);

Powyższy kod jest zamiennikiem dla drugiego przykładu, który pozwala uniknąć pętli for.
I gdzie w twoim pierwszym przykładzie odnoszą się do pierwszej tablicy. Dlatego fakt, który kiedykolwiek miało miejsce z pierwszą tablicą, można zobaczyć z drugiej tablicy.

Moje pytanie brzmi, czy te 2 przykłady są odpowiednie do zastosowań związanych z kodowaniem, czy też preferowany jest przykład 2.

Spójrz jeszcze raz, nie robią nic dla porównania. Pierwsza wskazuje na odwołanie do tablicy, a drugi fragment kodu odnosi się do elementów it it. Dlatego po prostu nie możesz ich porównywać.
Są też inne sposoby kopiowania elementów tablic, takich jak inne wymienione, a ja wolę
System.arraycopy
, ponieważ
1)
Arrays.copyOf
tworzy w sobie inny obiekt tablicy i zwraca go do miejsca, w którym System.arraycopy używa przekazanej tablicy.
2) klon jest zbyt wolny. Nigdy nie używaj go, jeśli nie masz innego wyjścia.
Jest kilka powodów, dla których unikam klona. Tutaj
Josh Bloch analysis on clone vs copy constructor
http://www.artima.com/intv/bloch13.html
(
podczas klonowania poszczególnych elementów

).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby zademonstrować problem za pomocą pierwszej metody, spróbuj tego:
int[] array1 = {2, 4, 6, 8, 10};
int[] array2 = array1;
array1[0] = 0;
System.out.println(array2[0]);

Jak myślisz, co to wydrukuje?
<blockquote class="spoiler">
0

Wyświetli 0, ponieważ
tablica2
wskazuje teraz na
tablica1
:
obie zmienne odnoszą się teraz do tego samego obiektu,
więc zmiana zawartości któregokolwiek z nich będzie wyglądać jak zmiana obu.
Więc twoja pierwsza metoda NOT nazywa się array copy.
To proste przypisanie jednej zmiennej do drugiej,
w tym przypadku przypisanie wartości z
tablica1
do
tablica2
,
więc obie zmienne wskazują na to samo.
Jeśli chodzi o drugą metodę,
to o wiele prostszy sposób na zrobienie tego samego:
int[] array2 = array1.clone();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W pierwszym przykładzie otrzymujesz tylko

jedna tablica

z dwiema zmiennymi,

odnosząc się

na nim. Przypisanie przenosi tylko odniesienie do tablicy. Zatem zarówno
firstArray
, jak i
secondArray
wskazują na tę samą tablicę. To nie jest kopia. Spróbuj ustawić
firstArray [0] = 99
i wypisać
secondArray
, a zobaczysz, że to ta sama tablica.
W drugim przykładzie ta rzeczywista kopia - utworzyłeś nową tablicę i skopiował każdą wartość. Teraz miejsce docelowe Fistarray [0] = 99 nie zmieni tablicy, do której
MocnoCarray
, ponieważ to

Kopiuj

.
Tak więc odpowiedź jest taka: jeśli dasz pierwszy sposób, otrzymasz niższe oceny.
W rzeczywistości istnieją lepsze sposoby kopiowania tablic za pomocą
System.arraycopy
,
Arrays.copyOf
lub
firstArray.clone ()
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

int[] secondArray = new int[5];

W drugim przykładzie tworzysz tablicę int za pomocą operatora
new
i ręcznie kopiujesz do niej elementy za pomocą pętli for. Za każdym razem, gdy używasz operatora
new
w Javie, następuje nowa alokacja pamięci (tworzenie obiektów).
Gdzie, tak jak w pierwszym przypadku, jest to tylko przypisanie referencji, oba wskazują na tę samą tablicę. Możesz łatwo sprawdzić, czy zmieniając zawartość jednej tablicy, zobaczysz ten sam efekt w drugiej tablicy. Nie stanie się to w przypadku drugiej kopii tablicy.
int []array2=array1;

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się