Sobes.tech
Junior

Ποιος είναι ο πιο αποδοτικός τρόπος αντιγραφής ενός πίνακα;

sobes.tech AI

Απάντηση από AI

Για τύπους δεδομένων primitive και αντικείμενα χωρίς βαθιά αντιγραφή, οι πιο αποτελεσματικοί τρόποι είναι:

  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). Μπορεί να είναι αναποτελεσματική για μεγάλα arrays ή αντικείμενα που δεν υλοποιούν το Serializable.

  4. Χρήση εξωτερικών βιβλιοθηκών (π.χ. Apache Commons Lang με τη μέθοδο SerializationUtils.clone()).

Ο πιο αποτελεσματικός τρόπος για επιφανειακές (επιφανειακές) αντιγραφές τύπων primitive και απλών αντικειμένων είναι το System.arraycopy() ή το Arrays.copyOf(). Για βαθιές αντιγραφές, συχνά προτιμάται ο κατασκευαστής αντιγραφής.