2009-09-02 7 views

Odpowiedz

7

Stary sposób szkoła:

public static void java.lang.System.arraycopy(Object src, int srcPos, 
     Object dest, int destPos, int length) 

Ten copys z jednej istniejącej macierzy do innego. Musisz samodzielnie przydzielić nową tablicę ... zakładając, że tworzysz tablicę z.

Od JDK 6 począwszy klasa java.util.Arrays posiada szereg copyOf metod wykonywania kopii tablic, z nowym rozmiarze. Te, które są istotne są:

public static <T> T[] copyOf(T[] original, int newLength) 

i

public static <T,U> T[] copyOf(U[] original, int newLength, 
     Class<? extends T[]> newType) 

Ten pierwszy tworzy kopię używając oryginalnego typ tablicy, a druga tworzy kopię z innym typem matrycy.

Należy zauważyć, że zarówno arraycopy, jak i 3 argumenty copyOf muszą sprawdzić typy każdego z elementów w pierwotnej (źródłowej) tablicy w stosunku do docelowego typu tablicy. Więc obaj mogą zgłaszać wyjątki typu. 2 argument copyOf (przynajmniej w teorii) nie wymaga żadnego sprawdzania typu, dlatego powinien być (teoretycznie) szybszy. W praktyce relatywna wydajność zależy od implementacji. Na przykład arraycopy jest często traktowany przez JVM w specjalny sposób.

+0

Dla każdego, kto zastanawia się 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'nie skompiluje się (_" Metoda copyOf (int [], int) w tablicach typów nie ma zastosowania dla argumentów (int [], int, Class ) "_) –

14
System.arraycopy 

(co daje możliwość skopiowania dowolnych części tablicy poprzez parametry offset i length). Lub

java.util.Arrays.copyOf 

który został dodany w JDK 6 i jest to metoda rodzajowa dzięki czemu może być stosowany:

Integer[] is = new Integer[] { 4, 6 } 
Integer[] copy = Arrays.copyOf(is, is.length); 

lub może ograniczyć typ:

Number[] is = new Number[]{4, 5}; 
Integer[] copy = Arrays.copyOf(is, is.length, Integer[].class); 

pamiętać, że można również użyć clone metodę na tablicy:

Number[] other = is.clone(); 
+0

Touché oxbow - ktoś przyszedł pół godziny później z tą samą odpowiedzią i został przyjęty! – pjp

+0

@pjp: Przyjąłem odpowiedź Stephena, ponieważ dodatkowo zajął się częścią dotyczącą wydajności pytania. – desolat

+0

To żaden problem * desolat * - nie wiem dlaczego * pjp * jest tak drażliwy! –

Powiązane problemy