Koks yra efektyviausias būdas kopijuoti masyvą?
sobes.tech AI
Atsakymas iš AI
Paprastų duomenų tipų ir objektų be giluminio kopijavimo efektyviausi būdai yra:
-
System.arraycopy(): Nativus metodas, optimizuotas greitam kopijavimui.// Pavyzdys naudojant 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(): Patogus metodas išArraysklasės, kuris viduje naudojaSystem.arraycopy().// Pavyzdys naudojant Arrays.copyOf int[] sourceArray = {1, 2, 3, 4, 5}; int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
Giluminio kopijavimo atveju (kai reikia kopijuoti ne tik nuorodas, bet ir pačius objektus, į kuriuos jos nurodo) gali būti reikalingi kiti metodai, pavyzdžiui:
-
Cloneablesąsajos įgyvendinimas irclone()metodo perrašymas:// Pavyzdys įgyvendinant Cloneable ir `clone()` class MyObject implements Cloneable { int value; MyObject innerObject; @Override protected Object clone() throws CloneNotSupportedException { MyObject cloned = (MyObject) super.clone(); // giluminis vidinio objekto kopijavimas cloned.innerObject = (MyObject) this.innerObject.clone(); return cloned; } } -
Kopijavimo konstruktoriaus naudojimas:
// Pavyzdys kopijavimo konstruktoriaus class MyObject { int value; MyObject innerObject; public MyObject(MyObject other) { this.value = other.value; // giluminis vidinio objekto kopijavimas this.innerObject = new MyObject(other.innerObject); } } -
Serijalizacijos/deserializacijos naudojimas (pavyzdžiui, naudojant
ByteArrayInputStreamirObjectInputStream): Gali būti neefektyvu dideliems masyvams ar objektams, kurie neįgyvendinaSerializable. -
Trečiųjų šalių bibliotekų naudojimas (pavyzdžiui, Apache Commons Lang
SerializationUtils.clone()metodas):
Efektyviausia plokščio (paviršinio) kopijavimo atveju yra System.arraycopy() arba Arrays.copyOf(). Giluminio kopijavimo dažnai pageidautina naudoti kopijavimo konstruktorių.