Qual è il modo preferito per copiare un array di un tipo non primitve in Java? Che ne dici dei problemi di rendimento?Java: copia array di tipo non primitivo
risposta
La via vecchia scuola era:
public static void java.lang.System.arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
Questo copys da uno esistente array ad un altro. Devi allocare il nuovo array tu stesso ... presumendo che tu stia facendo una copia di un array.
A partire da JDK 6, la classe java.util.Arrays
ha un numero di metodi copyOf
per creare copie di array, con una nuova dimensione. Quelli che sono rilevanti sono:
public static <T> T[] copyOf(T[] original, int newLength)
e
public static <T,U> T[] copyOf(U[] original, int newLength,
Class<? extends T[]> newType)
Questo primo esegue una copia utilizzando il tipo di matrice originale, e la seconda esegue una copia con un diverso tipo di matrice.
Si noti che sia arraycopy che l'argomento 3 copyOf devono controllare i tipi di ciascuno degli elementi nell'array originale (origine) rispetto al tipo di matrice di destinazione. Quindi entrambi possono lanciare eccezioni di tipo. Il 2 argomento copyOf (almeno in teoria) non ha bisogno di fare alcun tipo di controllo e quindi dovrebbe essere (in teoria) più veloce. In pratica, le prestazioni relative dipenderanno dall'attuazione. Ad esempio, la JVM riceve spesso un trattamento speciale da arraycopy
.
Per chi si chiedeva 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'non verrà compilato (_" Il metodo copyOf (int [], int) nel tipo Array non è applicabile per gli argomenti (int [], int, classe
System.arraycopy
(che dà la possibilità di copiare porzioni arbitrarie di un array tramite i parametri offset
e length
). O
java.util.Arrays.copyOf
che è stata aggiunta in JDK 6 ed è un metodo generico in modo che possa essere utilizzato:
Integer[] is = new Integer[] { 4, 6 }
Integer[] copy = Arrays.copyOf(is, is.length);
Oppure può restringere un tipo:
Number[] is = new Number[]{4, 5};
Integer[] copy = Arrays.copyOf(is, is.length, Integer[].class);
noti che è possibile utilizzare anche il metodo clone
su un array:
Number[] other = is.clone();
Touché oxbow - qualcuno è arrivato mezz'ora dopo con la stessa risposta ed è stato accettato! – pjp
@pjp: ho accettato la risposta di Stephen mentre si rivolgeva anche alla parte relativa alle prestazioni della domanda. – desolat
Non c'è nessun problema * desolat * - non sono sicuro del perché * pjp * sia così permaloso! –
- 1. convertire il vettore di tipo primitivo C++ nell'array primitivo di tipo java
- 2. Oggetto o tipo primitivo
- 3. Ordinamento di una lista di array per tipo booleano primitivo
- 4. Uso matchers hamcrest con array di tipo primitivo
- 5. Java Double vs double: tipo classe vs tipo primitivo
- 6. Spostare semantica e di tipo primitivo
- 7. Java Arrays.asList sul tipo di matrice primitivo produce inaspettato tipo List
- 8. Blocco su un tipo primitivo
- 9. Numero intero come tipo primitivo
- 10. In Java, si può "annullare" essere considerato un tipo primitivo?
- 11. Iniezione di un tipo primitivo in AngularJS
- 12. Android: non può invocare toString() sul tipo int primitivo
- 13. Come determinare il tipo primitivo di una variabile primitiva?
- 14. Impossibile richiamare toString() sul tipo primitivo int
- 15. Perché `str` è un tipo primitivo?
- 16. Inizializza array generico Java di tipo
- 17. Come verificare se il tipo è primitivo
- 18. Perché il compilatore Java non è come int primitivo come tipo per i valori in HashMap?
- 19. universale Parse tipo primitivo su C#
- 20. Restituisce "null" sulla funzione di tipo ritorno primitivo?
- 21. Sezione copia Java dell'array
- 22. Copia il contenuto di un array int in un doppio array in Java?
- 23. Rust esegue la dereferenziazione automatica di riferimenti di tipo primitivo?
- 24. Definizioni di "primitivo", "tipo di valore", "struct", "classe", "wrap" in Java e C#
- 25. Java - copia di oggetti arraylist
- 26. Modifica il valore di un tipo di dati primitivo spostato
- 27. Maven non copia i file non-java
- 28. Copia array di byte negli appunti
- 29. @IdClass con non primitivo @Id
- 30. È possibile creare un nuovo tipo di dati primitivo in Java
Si desidera solo copiare l'array stesso (ovvero i riferimenti nell'array) oppure si desidera clonare tutti gli oggetti a cui puntano i riferimenti nell'array? – Jesper