Sobes.tech
Junior
157

Koji je najučinkovitiji način za kopiranje niza?

Одговор од АИ

sobes.tech АИ

За примитивне типове података и објекте без дубоког копирања најефикаснији су следећи начини:

  1. System.arraycopy(): Нативна метода, оптимизована за брзо копирање.

    // Пример коришћења 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(): Погодна метода из класе Arrays. Унутра користи System.arraycopy().

    // Пример коришћења Arrays.copyOf
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

За дубоко копирање објеката (када је потребно копирати не само референце, већ и саме објекте на које они указују) могу бити потребни други приступи, као што су:

  1. Реализација интерфејса Cloneable и преоптерећење метода clone(). Не препоручује се за нове развоје због бројних проблема.

    // Пример реализације Cloneable и clone()
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // дубоко копирање унутрашњег објекта
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Коришћење конструктора копирања.

    // Пример конструктора копирања
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // дубоко копирање унутрашњег објекта
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Коришћење серијализације/десеријализације (нпр. помоћу ByteArrayInputStream и ObjectInputStream). Може бити неефикасно за велике низове или објекте који не реализују Serializable.

  4. Коришћење страних библиотека (нпр. Apache Commons Lang са методом SerializationUtils.clone()).

Најефикасније за плоско (површинско) копирање примитивних типова и једноставних објеката је System.arraycopy() или Arrays.copyOf(). За дубоко копирање често је пожељнији конструктор копирања.