metodo copiar copia clonar array java arrays clone

java - copiar - ¿Hay alguna razón para preferir System.arraycopy() sobre clone()?



copy array javascript (4)

Al copiar una matriz completa, a menudo he visto a gente escribir:

int[] dest = new int[orig.length]; System.arraycopy(orig, 0, dest, 0, orig.length);

Pero me parece que no hay ninguna razón para favorecer esto más:

int[] dest = orig.clone();

De todos modos, ambos son copias superficiales. Probablemente estas personas simplemente no se dan cuenta de que el clone existe. Entonces, ¿hay alguna razón para no usar el clone ?


Me pasó a mirar esta pregunta cuando estaba reflexionando sobre la misma duda. Siento que arraycopy() es un método que se utilizará cuando la matriz esté predefinida (es decir, la memoria ya está asignada). Por lo tanto, la sobrecarga asociada con la asignación de memoria no se repite.

Por ejemplo, imagina un caso cuando hayas definido una matriz grande que se actualiza periódicamente. Luego, al usar clone() se recreará una matriz del tamaño requerido cada vez que se copia la matriz. Sin embargo, arraycopy() usa el espacio de memoria preasignado.

Así, arraycopy() es más eficiente en ciertos escenarios en comparación con clone() . Por otro lado, clone() da como resultado un código compacto.


Solo estoy adivinando aquí, pero podría haber una buena razón para usar System.arraycopy porque diferentes JVM podrían posiblemente implementarlas de una manera que aproveche las capacidades nativas del sistema subyacente para aumentar el rendimiento.

Por ejemplo, una implementación de JVM podría usar una llamada de biblioteca nativa como memcpy que podría aprovecharse de algunos trucos del controlador de memoria para realizar la acción de una manera increíblemente rápida e inteligente. Sin embargo, la implementación de Object.clone podría no ser un buen candidato para dicha optimización debido a su naturaleza virtual.


No. Si realmente eres microdetector, entonces tal vez, dependiendo de qué JVM estés ejecutando. Pero en realidad, no.


  • clone() hace una copia distinta de la primera matriz con su propia referencia.
  • System.arraycopy() utiliza JNI (Java Native Interface) para copiar una matriz (o partes de ella), por lo que es sorprendentemente rápido, como puede confirmar here ;
  • clone() crea una nueva matriz con las mismas características que la matriz anterior, es decir, el mismo tamaño, el mismo tipo y el mismo contenido. Consulte here algunos ejemplos de clone en acción;
  • manual copying es, bueno, copia manual. No hay mucho que decir acerca de este método, excepto que mucha gente lo ha encontrado como el más performant .
  • arraynew = arrayold no copia la matriz; simplemente señala una arraynew a la dirección de memoria de arrayold o, en otras palabras, simplemente está asignando una referencia a la matriz anterior.