Ποιος είναι ο πιο αποδοτικός τρόπος αντιγραφής ενός πίνακα;
sobes.tech AI
Απάντηση από AI
Για τύπους δεδομένων primitive και αντικείμενα χωρίς βαθιά αντιγραφή, οι πιο αποτελεσματικοί τρόποι είναι:
-
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). Μπορεί να είναι αναποτελεσματική για μεγάλα arrays ή αντικείμενα που δεν υλοποιούν τοSerializable. -
Χρήση εξωτερικών βιβλιοθηκών (π.χ. Apache Commons Lang με τη μέθοδο
SerializationUtils.clone()).
Ο πιο αποτελεσματικός τρόπος για επιφανειακές (επιφανειακές) αντιγραφές τύπων primitive και απλών αντικειμένων είναι το System.arraycopy() ή το Arrays.copyOf(). Για βαθιές αντιγραφές, συχνά προτιμάται ο κατασκευαστής αντιγραφής.