Koji je najučinkovitiji način za kopiranje niza?
Одговор од АИ
sobes.tech АИ
За примитивне типове података и објекте без дубоког копирања најефикаснији су следећи начини:
-
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); -
Arrays.copyOf(): Погодна метода из класеArrays. Унутра користиSystem.arraycopy().// Пример коришћења Arrays.copyOf int[] sourceArray = {1, 2, 3, 4, 5}; int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
За дубоко копирање објеката (када је потребно копирати не само референце, већ и саме објекте на које они указују) могу бити потребни други приступи, као што су:
-
Реализација интерфејса
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; } } -
Коришћење конструктора копирања.
// Пример конструктора копирања class MyObject { int value; MyObject innerObject; public MyObject(MyObject other) { this.value = other.value; // дубоко копирање унутрашњег објекта this.innerObject = new MyObject(other.innerObject); } } -
Коришћење серијализације/десеријализације (нпр. помоћу
ByteArrayInputStreamиObjectInputStream). Може бити неефикасно за велике низове или објекте који не реализујуSerializable. -
Коришћење страних библиотека (нпр. Apache Commons Lang са методом
SerializationUtils.clone()).
Најефикасније за плоско (површинско) копирање примитивних типова и једноставних објеката је System.arraycopy() или Arrays.copyOf(). За дубоко копирање често је пожељнији конструктор копирања.