Jaký je nejefektivnější způsob kopírování pole?
sobes.tech AI
Odpověď od AI
Pro primitivní datové typy a objekty bez hluboké kopie jsou nejúčinnější následující způsoby:
-
System.arraycopy(): Nativní metoda optimalizovaná pro rychlé kopírování.// Příklad použití 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(): Pohodlná metoda ze třídyArrays. Interně používáSystem.arraycopy().// Příklad použití Arrays.copyOf int[] sourceArray = {1, 2, 3, 4, 5}; int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
Pro hluboké kopírování objektů (když je třeba kopírovat nejen odkazy, ale i objekty, na které odkazují) mohou být potřeba jiné přístupy, například:
-
Implementace rozhraní
Cloneablea přepsání metodyclone(). Nedoporučuje se pro nové vývoje kvůli mnoha problémům.// Příklad implementace Cloneable a clone() class MyObject implements Cloneable { int value; MyObject innerObject; @Override protected Object clone() throws CloneNotSupportedException { MyObject cloned = (MyObject) super.clone(); // hluboká kopie vnitřního objektu cloned.innerObject = (MyObject) this.innerObject.clone(); return cloned; } } -
Použití konstruktoru kopie.
// Příklad konstruktoru kopie class MyObject { int value; MyObject innerObject; public MyObject(MyObject other) { this.value = other.value; // hluboká kopie vnitřního objektu this.innerObject = new MyObject(other.innerObject); } } -
Použití serializace/deserializace (například s
ByteArrayInputStreamaObjectInputStream). Může být neefektivní pro velké pole nebo objekty, které neimplementujíSerializable. -
Použití externích knihoven (například Apache Commons Lang s metodou
SerializationUtils.clone()).
Nejúčinnější pro povrchové (ploché) kopírování primitivních typů a jednoduchých objektů je System.arraycopy() nebo Arrays.copyOf(). Pro hluboké kopírování je často preferován konstruktor kopie.