2012-08-13 21 views
5

Pracowałem dzisiaj ze stosunkowo dużymi tablicami String. (Około 400 x 400) Zastanawiałem się, w jaki sposób tworzenie jednej tablicy równej drugiej działa dokładnie. Na przykład:Java: Jak działają tablice

String[][] array1 = new String[400][400]; 
String[][] array2 = array1; 

Czy utworzenie jednej tablicy równej drugiej jest równoznaczne z zapętlaniem się każdego elementu i wyrównaniem go z odpowiednią pozycją w innej tablicy? (Podobnie jak poniżej)

for(int y = 0; y < 400; y++) { 
    for(int x = 0; x < 400; x++) { 
     array2[x][y] = array1[x][y]; 
    } 
} 

Teraz jest metoda pętli to samo, co jedna tablica równa się innej? Czy pierwszy/drugi jest szybszy od drugiego? Osobiście uważam, że pierwszy byłby szybszy tylko dlatego, że nie ma rekursji lub konieczności ręcznego przydzielania pamięci do array2 przed rekursją. Ale nie mam pojęcia, gdzie zacząć szukać tych informacji i chciałbym zrozumieć logistykę tego, jak Java przetwarza takie rzeczy.

+0

Spójrz na [Java Arrays] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) – adatapost

+3

Wydaje mi się również, że nie masz pewności co do definicji rekursji. –

+0

Interesujące, ale nie widzę nic na ten temat, chyba że na dole, gdzie wspomniano o metodzie arrayCopy, która nie ma nic wspólnego z uczynieniem jednej tablicy równą innej z równym znakiem Doug Ramsey: Prawdopodobnie jestem, ponieważ Naprawdę nie wiem JAK rzeczy działają tak dużo, jak wiem, że faktycznie działają. – CoderTheTyler

Odpowiedz

12

Nie, to nie to samo: tablice są obiektami odniesienia, więcstaje się aliasem array1, a nie jego kopią. Każde zadanie przypisane do elementu array2 staje się "widoczne" przez array1 i na odwrót. Jeśli chcesz utworzyć kopię tablicy jednowymiarowej, możesz użyć jej metody clone(); należy zauważyć, że kopia będzie płytka, tj. poszczególne elementy tablicy będą klonowane w postaci , a nie (czyniąc sztuczkę niemającą wpływu na tablicę 2-D opisaną w twoim poście).

+0

Wow ... Nigdy tego nie zauważyłem. To prawdopodobnie wyjaśniałoby, dlaczego tak wiele moich programów z tablicami nie działa tak, jak chcę. Dzięki za oświecenie! – CoderTheTyler

5

nie wykonuje kopii elementów, tylko odwołanie do tablicy. Tak więc array2 i array1 oba odnoszą się do tej samej podstawowej tablicy.

Jest to bardzo łatwe do ustalenia dla siebie:

String[][] array1 = new String[4][4]; 
array1[0][0] = "some string"; 
String[][] array2 = array1; 
array1[0][0] = "another string"; 
System.out.println("array2: " + array2[0][0]); 
array2[0][0] = "a third string"; 
System.out.println("array1: " + array1[0][0]); 
+0

Tak samo, jak odpowiedź @ dasblinkenlight, ale z przykładem. Dzięki! :RE – CoderTheTyler

1

Hmm myślę, że po dokonaniu jednej tablicy równy innym, wystarczy zmienić nazwę. Np

ARRAY 1 - * [] [], [], [], ... [] [], gdzie * jest odniesienie do tablicy 1
Tablica 2 - & [] [], [], [], .. . [] [], gdzie & jest odniesienie do tablicy 2

następnie ustawienie macierzy 1 = Tablica 2 tablicy 1 po prostu zmieniać punkt odniesienia do & i czytać w nawiązaniu pamięci &

1

druga linia pierwszy przykład kodu tworzy zmienną referencyjną typu String [], która odnosi się do tego samego dwuwymiarowego obiektu tablicy, który ref erence array1 odnosi się do. W pamięci jest tylko jedna dwuwymiarowa tablica, ale odnoszą się do niej dwie zmienne referencyjne: tablica1 i tablica2.

Wydaje się, że jesteś zdezorientowany definicją rekursji, więc wskażę ci tutaj- Recursion in Computer Science.