Tengo una matriz a
que se actualiza constantemente. Digamos Vamos a = [1,2,3,4,5]
. Necesito hacer una copia duplicada exacta de a
y llamarlo b
. Si tuviera a
que cambiar a [6,7,8,9,10]
, b
todavía debería ser [1,2,3,4,5]
. ¿Cuál es la mejor manera de hacer esto? Intenté un for
bucle como:
for(int i=0; i<5; i++) {
b[i]=a[i]
}
pero eso no parece funcionar correctamente. No utilice términos avanzados como copia profunda, etc., porque no sé lo que eso significa.
System.arraycopy
, verá que el método necesita verificar varias cosas antes de que comience. Algunas de estas comprobaciones son innecesarias con un bucle de copia, dependiendo de los tipos de matriz estática.clone()
resulta ser el más rápido para 250 000 elementos.src.clone()
es más legible y tiene muchas menos oportunidades de error que asignar una nueva matriz y hacerarraycopy
. (Y también es rápido.)puedes usar
también.
fuente
Si quieres hacer una copia de:
Este es el camino a seguir:
Arrays.copyOf
puede ser más rápido quea.clone()
en arreglos pequeños. Ambos elementos de copia son igualmente rápidos pero clone () regresa,Object
por lo que el compilador tiene que insertar una conversión implícita enint[]
. Puede verlo en el código de bytes, algo como esto:fuente
Buena explicación de http://www.journaldev.com/753/how-to-copy-arrays-in-java
Métodos de copia de matriz de Java
fuente
Tengo la sensación de que todas estas "mejores formas de copiar una matriz" realmente no van a resolver su problema.
Tu dices
Mirando ese ciclo, no hay una razón obvia para que no funcione ... a menos que:
a
yb
desordenadas (por ejemplo,a
y seb
refiere a la misma matriz), oa
matriz simultáneamente.En cualquier caso, las formas alternativas de copiar no resolverán el problema subyacente.
La solución para el primer escenario es obvia. Para el segundo escenario, tendrá que encontrar alguna forma de sincronizar los hilos. Las clases de matriz atómica no ayudan porque no tienen constructores de copia atómica o métodos de clonación, pero la sincronización usando un mutex primitivo hará el truco.
(Hay indicios en su pregunta que me llevan a pensar que esto realmente está relacionado con el hilo; por ejemplo, su declaración que
a
está cambiando constantemente).fuente
Puede intentar usar Arrays.copyOf () en Java
fuente
Todas las soluciones que llaman la longitud de la matriz, agregue su código redundante nulos checkersconsider ejemplo:
Le recomiendo que no invente la rueda y use la clase de utilidad donde ya se han realizado todas las verificaciones necesarias. Considere ArrayUtils de apache commons. Su código se acorta:
Apache comunes que puedes encontrar allí
fuente
También puedes usar
Arrays.copyOfRange
.Ejemplo :
Este método es similar a
Arrays.copyOf
, pero es más flexible. Ambos se usanSystem.arraycopy
debajo del capó.Ver :
fuente
Para una copia segura de nulo de una matriz, también puede usar un opcional con el
Object.clone()
método proporcionado en esta respuesta .fuente
Optional
objeto es solo un objeto vacío con una referencia a la matriz existente. Sobre el impacto en el rendimiento, diría que es prematuro decir que en realidad es un impacto ya que este tipo de construcción es un buen candidato para alinearse dentro de la JVM y luego no es más impacto que otros métodos. Es una cuestión de estilo (programación funcional versus programación procesal, pero no solo) considerarlo más complicado o no.Si tiene que trabajar con matrices en bruto y no
ArrayList
seArrays
tiene lo que necesita. Si observa el código fuente, estas son las mejores formas de obtener una copia de una matriz. Tienen una buena programación defensiva porque elSystem.arraycopy()
método arroja muchas excepciones no verificadas si lo alimenta con parámetros ilógicos.Puede usar cualquiera de los dos
Arrays.copyOf()
que copiará desde el primerNth
elemento al nuevo conjunto más corto.o
Arrays.copyOfRange()
también hará el truco:Como puede ver, ambos son solo funciones de envoltura
System.arraycopy
con lógica defensiva de que lo que está tratando de hacer es válido.System.arraycopy
es la forma más rápida de copiar matrices.fuente
Tuve un problema similar con las matrices 2D y terminé aquí. Estaba copiando la matriz principal y cambiando los valores de las matrices internas, y me sorprendió cuando los valores cambiaron en ambas copias. Básicamente, ambas copias eran independientes pero contenían referencias a las mismas matrices internas y tuve que hacer una matriz de copias de las matrices internas para obtener lo que quería.
Probablemente no sea el problema del OP, pero espero que pueda ser útil.
fuente