2010-03-03 19 views
10

Próbowałem utworzyć niezależną kopię tablicy, ale nie mogłem jej uzyskać. widzę, że nie mogę skopiować liczby całkowitej przez liczbę całkowitą za pomocą pętli for ze względu na wydajność. Czy jest jakiś inny sposób? To był mój kod:kopiowanie tablicy według wartości w java

int[] temp = new int[arr.length]; 
temp = arr; 
+2

Jakie "przyczyny wydajności"? Czy naprawdę ** przetestowałeś **, że ten fragment kodu jest problemem? A może po prostu zgadujesz? –

+0

Naprawdę dziwne przyczyny wydajności ... –

Odpowiedz

18

Spójrz na System.arraycopy() metoda. Podobnych:

int[] b = new int[a.length]; 
System.arraycopy(a, 0, b, 0, a.length); 
4

Zapoznaj się z System.arraycopy(). Może kopiować tablice dowolnego typu i jest preferowanym (i zoptymalizowanym) sposobem kopiowania tablic.

12

Arrays.copyOf() tworzy nową kopię istniejącej macierzy (opcjonalnie o innej długości).

+1

Zauważ, że ta metoda jest nowa w 1.6 i prawdopodobnie łatwiejsza w użyciu niż System.arraycopy() –

+0

@matt: Nie wspominam już o "nowym w Javie 6", ponieważ Java 6 jest już wystarczająco duża (Grudzień 2006 to już jakiś czas w przeszłości). –

+0

Nie miałem na myśli tego, aby go nie używać - tylko heads-up dla każdego, kto go nie zna, ponieważ nie używa 1.6 –

1

Możesz użyć System.arraycopy, ale wątpię, że będzie to znacznie bardziej wydajne. Pamięć musi zostać skopiowana w każdym razie, więc jedyną możliwą optymalizacją jest jednoczesne skopiowanie większych porcji pamięci. Jednak rozmiar skopiowanego fragmentu pamięci jest mocno ograniczony przez architekturę procesora/systemu.

+0

Szczególnie w przypadku dużych tablic, metoda ta może być trochę szybsza niż prosta implementacja pętli for. –

5

Spróbuj użyć do tego celu metody clone(). Jak pamiętam, jest to jedyny przypadek, w którym Josh Bloch w Effective Java zalecał klonowanie.

int[] temp = arr.clone(); 

Ale arrayCopy jest znacznie szybszy. Przykładowy test wydajności dla zestawu 3 000 000 elementów:

System.arrayCopy time: 8ms 
    arr.clone() time: 29ms 
Arrays.copyOf() time: 49ms 
simple for-loop time: 75ms 
+0

Ładne statystyki, ale to nasuwa pytanie, dlaczego powinien "spróbować użyć clone()" – Draemon

+1

, ponieważ najpierw napisałem o clone(), a następnie zrobiłem test dla dobra zainteresowania :) – Roman

+0

Nie mogę odtworzyć wyników, zobacz [mój mikro-benchmark] (http://stackoverflow.com/a/12157504/829571), który pokazuje, że pierwsze 3 metody są równoważne. Tak więc faworyzuję 'Arrays.copyOf', który został celowo zbudowany dla tego zadania. – assylias

Powiązane problemy