¿Cuál es la forma preferida de copiar una matriz de tipo no primitivo en Java? ¿Qué hay de los problemas de rendimiento?Java: copiar matriz de tipo no primitivo
Respuesta
La forma de la vieja escuela era:
public static void java.lang.System.arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
Este copys de una matriz existente a otro. Debe asignar la nueva matriz usted mismo ... suponiendo que está haciendo una copia de una matriz.
A partir de JDK 6 en adelante, la clase java.util.Arrays
tiene una serie de métodos copyOf
para hacer copias de matrices, con un nuevo tamaño. Los que son relevantes son:
public static <T> T[] copyOf(T[] original, int newLength)
y
public static <T,U> T[] copyOf(U[] original, int newLength,
Class<? extends T[]> newType)
Esta primera uno hace una copia con el tipo de matriz original, y la segunda se hace una copia con un diferente tipo de matriz.
Tenga en cuenta que tanto arraycopy como los 3 argumentos copyOf tienen que verificar los tipos de cada uno de los elementos en la matriz original (fuente) con respecto al tipo de matriz de destino. Entonces ambos pueden arrojar excepciones de tipo. El argumento 2 de copyOf (al menos en teoría) no necesita hacer ninguna comprobación de tipo y, por lo tanto, debería ser (en teoría) más rápido. En la práctica, el rendimiento relativo dependerá de la implementación. Por ejemplo, el JVM a menudo da un tratamiento especial a arraycopy
.
Para quien se haya preguntado 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'no compila (_" El método copyOf (int [], int) en el tipo Arrays no es aplicable para los argumentos (int [], int, clase
System.arraycopy
(que le da la capacidad de copiar porciones arbitrarias de una matriz a través de los parámetros offset
y length
). O
java.util.Arrays.copyOf
que se añadió en JDK 6 y es un método genérico para que pueda ser utilizado:
Integer[] is = new Integer[] { 4, 6 }
Integer[] copy = Arrays.copyOf(is, is.length);
o se puede reducir a un tipo:
Number[] is = new Number[]{4, 5};
Integer[] copy = Arrays.copyOf(is, is.length, Integer[].class);
en cuenta que puede también utilice el clone
método en una matriz:
Number[] other = is.clone();
Toque oxbow - alguien llegó media hora más tarde con la misma respuesta y fue aceptado! – pjp
@pjp: Acepté la respuesta de Stephen, ya que también abordó la parte del rendimiento de la pregunta. – desolat
No es problema en absoluto * desolat * - no estoy seguro de por qué * pjp * es tan delicado! –
- 1. Objeto o tipo primitivo
- 2. Entero como tipo primitivo
- 3. ¿Es String un tipo primitivo?
- 4. ¿Por qué no hay ningún tipo primitivo para Cadena?
- 5. ¿Con qué propósito Java tiene un tipo primitivo flotante?
- 6. copiar una matriz 2D en Java
- 7. Encuentra dinámicamente la clase que representa un tipo Java primitivo
- 8. En Java, ¿se puede considerar "nulo" como un tipo primitivo?
- 9. ¿Volátil o sincronizado para el tipo primitivo?
- 10. Verifique el tipo de campo primitivo
- 11. .NET - Copiar de matriz no administrada a matriz no administrada
- 12. ¿Cómo eliminar duplicados de una lista basada en un objeto java personalizado no un tipo primitivo?
- 13. No se puede invocar toString() en el tipo primitivo int
- 14. Jackson deserializar a lo específico tipo primitivo
- 15. universal Analizar Tipo primitivo en C#
- 16. ¿Cómo paso un tipo de datos primitivo por referencia?
- 17. ¿Devuelve "nulo" en la función de tipo de retorno primitivo?
- 18. ¿Cómo determinar el tipo primitivo de una variable primitiva?
- 19. Anulación del manejo predeterminado de tipo primitivo en Json.Net
- 20. Determinando si un Objeto es del tipo primitivo
- 21. @IdClass con no primitivo @Id
- 22. ¿Es una matriz un tipo primitivo o un objeto (o algo completamente diferente)?
- 23. ¿Cómo copiar una matriz?
- 24. Java - copiar objetos ArrayList
- 25. Definiciones de "primitivo", "tipo de valor", "estructura", "clase", "ajuste" en Java y C#
- 26. Cambiar el valor de un tipo de datos primitivo envuelto
- 27. Tipo de datos escalar vs. primitivo: ¿son lo mismo?
- 28. ¿Hay una biblioteca para comparar valores de tipo primitivo?
- 29. ¿Cómo puedo saber genéricamente si una clase Java es un tipo primitivo?
- 30. ¿Por qué usar = para inicializar un tipo primitivo en C++?
¿Desea copiar solo la matriz (es decir, las referencias en la matriz), o también desea clonar todos los objetos a los que apuntan las referencias en la matriz? – Jesper