Sobes.tech
Junior

Qual é a forma mais eficiente de copiar um array?

sobes.tech IA

Resposta da IA

Para tipos de dados primitivos e objetos sem cópia profunda, os métodos mais eficientes são:

  1. System.arraycopy(): Método nativo otimizado para cópias rápidas.

    // Exemplo de uso de System.arraycopy
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = new int[sourceArray.length];
    System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);
    
  2. Arrays.copyOf(): Método conveniente da classe Arrays. Internamente usa System.arraycopy().

    // Exemplo de uso de Arrays.copyOf
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

Para cópia profunda de objetos (quando é necessário copiar não apenas as referências, mas também os objetos aos quais elas apontam), podem ser necessárias outras abordagens, como:

  1. Implementação da interface Cloneable e sobrescrita do método clone(). Não recomendado para novos desenvolvimentos devido a vários problemas.

    // Exemplo de implementação de Cloneable e clone()
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // cópia profunda do objeto interno
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Uso de construtor de cópia.

    // Exemplo de construtor de cópia
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // cópia profunda do objeto interno
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Uso de serialização/deserialização (por exemplo, com ByteArrayInputStream e ObjectInputStream). Pode ser ineficiente para grandes arrays ou objetos que não implementam Serializable.

  4. Uso de bibliotecas externas (por exemplo, Apache Commons Lang com o método SerializationUtils.clone()).

O método mais eficiente para cópia superficial (nível plano) de tipos primitivos e objetos simples é System.arraycopy() ou Arrays.copyOf(). Para cópia profunda, muitas vezes a abordagem preferida é o construtor de cópia.