java copy array how copy clone an array java
Αυτό το σεμινάριο για την αντιγραφή και την κλωνοποίηση των συστοιχιών συζητά τις διάφορες μεθόδους για την αντιγραφή μιας σειράς στην Java:
Εδώ θα συζητήσουμε τη λειτουργία αντιγραφής των συστοιχιών Java. Η Java παρέχει διάφορους τρόπους με τους οποίους μπορείτε να δημιουργήσετε αντίγραφα των στοιχείων του πίνακα. Όπως γνωρίζουμε, στη Java, οι πίνακες μπορούν να περιέχουν στοιχεία πρωτόγονων τύπων ή αντικειμένων ή αναφορών.
Ενώ δημιουργείτε αντίγραφα πρωτόγονων τύπων, η εργασία είναι μάλλον εύκολη, αλλά όταν πρόκειται για αντικείμενα ή αναφορές, πρέπει να προσέξετε εάν το αντίγραφο είναι βαθύ ή ρηχό.
=> Ρίξτε μια ματιά στον οδηγό για αρχάριους Java εδώ.
Το ρηχό αντίγραφο δημιουργεί ένα αντίγραφο του στοιχείου. Δεν είναι πρόβλημα όταν εμπλέκονται πρωτόγονοι τύποι δεδομένων. Αλλά όταν πρόκειται για αναφορές, ένα ρηχό αντίγραφο θα αντιγράψει απλώς την τιμή και όχι τις υποκείμενες πληροφορίες.
Έτσι, παρόλο που έχετε δημιουργήσει αντίγραφα των στοιχείων, μια αλλαγή σε ένα αντίγραφο θα αντικατοπτρίζεται και σε άλλο αντίγραφο καθώς οι θέσεις μνήμης είναι κοινές. Για να το αποφύγετε αυτό, πρέπει να αναζητήσετε ένα σε βάθος αντίγραφο στο οποίο δεν γίνεται κοινή χρήση των θέσεων μνήμης.
Τι θα μάθετε:
Αντιγράψτε και κλωνοποιήστε πίνακες Java
Η Java σάς επιτρέπει να αντιγράφετε πίνακες χρησιμοποιώντας είτε τη μέθοδο άμεσης αντιγραφής που παρέχεται από το java.util ή την κλάση συστήματος. Παρέχει επίσης μια μέθοδο κλώνου που χρησιμοποιείται για την κλωνοποίηση ενός ολόκληρου πίνακα.
Σε αυτό το σεμινάριο, θα συζητήσουμε τις ακόλουθες μεθόδους αντιγραφής και κλωνοποίησης συστοιχιών.
- Μη αυτόματη αντιγραφή με χρήση για βρόχο
- Χρήση του System.arraycopy ()
- Χρήση του Arrays.copyOf ()
- Χρήση του Arrays.copyOfRange ()
- Χρήση Object.clone ()
Ας εξερευνήσουμε !!
Μη αυτόματη αντιγραφή με χρήση για βρόχο
Κανονικά όταν αντιγράφουμε μεταβλητές, για παράδειγμα, a και b, εκτελούμε τη λειτουργία αντιγραφής ως εξής:
α = β;
Δεν θα λειτουργήσει σωστά εάν εφαρμόσουμε την ίδια μέθοδο στις συστοιχίες.
Ας δούμε ένα παράδειγμα προγραμματισμού.
public class Main { public static void main(String() args) { int intArray() = {12,15,17}; //print original intArray System.out.println('Contents of intArray() before assignment:'); for (int i=0; i Παραγωγή:

Στο παραπάνω πρόγραμμα, υπάρχουν δύο πίνακες, δηλαδή intArray και copyArray. Ο στόχος είναι να αντιγράψετε τα περιεχόμενα του intArray στο copyArray. Για να γίνει αυτό, εισάγεται η δήλωση copyArray = intArray. Αυτό που γίνεται εδώ είναι οι αναφορές του πίνακα. Ως εκ τούτου, αυτό δεν είναι πραγματική αντιγραφή.
Ως αποτέλεσμα της παραπάνω δήλωσης, η θέση μνήμης του intArray μοιράζεται και το copyArray. Τώρα, όταν το στοιχείο copyArray αυξάνεται, αυτή η αλλαγή αντικατοπτρίζεται και στο intArray. Αυτό εμφανίζεται στην έξοδο.
Για να ξεπεράσουμε αυτό το πρόβλημα, χρησιμοποιούμε μια μέθοδο αντιγραφής του πίνακα χρησιμοποιώντας το loop. Εδώ, κάθε στοιχείο του αρχικού πίνακα αντιγράφεται στο νέο πίνακα χρησιμοποιώντας ένα βρόχο για.
Αυτό το πρόγραμμα φαίνεται παρακάτω.
public class Main { public static void main(String() args) { int intArray() = {12,15, 17}; // define an array copyArray to copy contents of intArray int copyArray() = new int(intArray.length); // copy contents of intArray to copyArray for (int i=0; i Παραγωγή:

Εδώ έχουμε τροποποιήσει το προηγούμενο πρόγραμμα για να συμπεριλάβουμε το loop και το εσωτερικό για loop, εκχωρούμε κάθε στοιχείο του intArray στο αντίστοιχο στοιχείο του copyArray. Με αυτόν τον τρόπο, τα στοιχεία αντιγράφονται πραγματικά. Έτσι, όταν τροποποιείται ένας πίνακας, οι αλλαγές δεν αντικατοπτρίζονται σε έναν άλλο πίνακα.
Χρήση του System.arraycopy ()
Η κλάση συστήματος της Java έχει μια μέθοδο που ονομάζεται 'ArrayCOpy' που σας επιτρέπει να αντιγράψετε στοιχεία από έναν πίνακα σε έναν άλλο πίνακα.
Το γενικό πρωτότυπο αυτής της μεθόδου έχει ως εξής:
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
Εδώ,
- src_array => Πίνακας προέλευσης από όπου θα αντιγραφούν τα περιεχόμενα.
- src_Pos => Η θέση στον πίνακα προέλευσης από όπου θα ξεκινήσει η αντιγραφή.
- dest_array => Πίνακας προορισμού στον οποίο θα αντιγραφούν στοιχεία.
- dest_Pos => Θέση εκκίνησης στη συστοιχία προορισμού για τα στοιχεία που θα αντιγραφούν.
- μήκος => Μήκος του πίνακα που θα αντιγραφεί.
Ας κατανοήσουμε αυτήν τη μέθοδο με ένα παράδειγμα.
class Main { public static void main(String() args) { //declaring a source array char() src_array = { 'S','o','f','t','w','a','r','e','T','e','s','t','i','n','g','H','e','l','p'}; char() dest_array = new char(19); System.arraycopy(src_array, 0, dest_array, 0,19); System.out.println('Source array:' + String.valueOf(src_array)); System.out.println('Destination array after arraycopy:'+ String.valueOf(dest_array)); } }
Παραγωγή:

Στο παραπάνω πρόγραμμα, χρησιμοποιούμε τη μέθοδο «arraycopy» για να αντιγράψουμε έναν πίνακα σε έναν άλλο πίνακα. Μπορείτε να δείτε την κλήση στη μέθοδο arraycopy. Αντιγράφουμε τον πίνακα προέλευσης από την αρχή (0ουτοποθεσία) και αντιγράψτε ολόκληρο τον πίνακα.
Τέλος, εμφανίζουμε το ισοδύναμο συμβολοσειράς τόσο της πηγής όσο και των συστοιχιών προορισμού.
Με τη μέθοδο arraycopy, μπορείτε να αντιγράψετε ακόμη και μερικές σειρές καθώς παίρνει τις θέσεις του στοιχείου έναρξης και λήξης ως ορίσματα. Αυτή η μέθοδος δημιουργεί ένα ρηχό αντίγραφο στοιχείων πίνακα.
Χρήση του Arrays.copyOf ()
Η μέθοδος Arrays.copyOf () χρησιμοποιεί εσωτερικά τη μέθοδο System.arraycopy (). Αν και δεν είναι τόσο αποτελεσματικό όσο το arraycopy, μπορεί να χρησιμοποιηθεί για την αντιγραφή πλήρους ή μερικής συστοιχίας όπως η μέθοδος arraycopy.
Η μέθοδος ‘copyOf ()’ είναι μέρος του πακέτου java.util και ανήκει στην τάξη “Arrays”.
Το πρωτότυπο αυτής της μεθόδου έχει ως εξής:
public static int() copyOf(int() original_array,int newLength)
Που,
- πρωτότυπο: Ο πίνακας που θα αντιγραφεί στο νέο πίνακα.
- νέο Μήκος: Το μήκος του αντιγραμμένου πίνακα που θα επιστραφεί.
Έτσι, αυτή η μέθοδος δημιουργεί ένα αντίγραφο του πίνακα που παρέχεται στο πρώτο όρισμα στο καθορισμένο μήκος περικόπτοντας ή γεμίζοντας το μήκος με 0 στον νέο πίνακα. Αυτό σημαίνει ότι εάν το μήκος του αντιγράφου πίνακα είναι μεγαλύτερο από τον αρχικό πίνακα, τα 0s αντικαθίστανται για τα υπόλοιπα στοιχεία.
Το πρόγραμμα που δίνεται παρακάτω δείχνει ένα παράδειγμα της μεθόδου copyOf.
importjava.util.Arrays; public class Main { public static void main(String args()) { // define original array int() even_Array = new int() {2,4,6,8}; System.out.println('Original Array:' + Arrays.toString(even_Array)); // copying array even_Array to copy_Array int() copy_Array = Arrays.copyOf(even_Array,5); System.out.println('Copied Array:' + Arrays.toString(copy_Array)); // assign value to unassigned element of copied array copy_Array(4) = 10; System.out.println('Copied and modified Array:' + Arrays.toString(copy_Array)); } }
Παραγωγή:

Στο παραπάνω πρόγραμμα, αντιγράφουμε την ομοιόμορφη σειρά μήκους 4 χρησιμοποιώντας τη μέθοδο copyOf. Το δεύτερο όρισμα που παρέχεται είναι 5. Ως εκ τούτου, ο νέος αντιγραμμένος πίνακας έχει 5 στοιχεία σε αυτό. Τα πρώτα τέσσερα είναι ίδια με τον αρχικό πίνακα και το πέμπτο στοιχείο είναι 0 καθώς το copyOf το γεμίζει επειδή το μήκος του αρχικού πίνακα είναι μικρότερο από αυτό του νέου πίνακα.
Χρήση του Arrays.copyOfRange ()
Η μέθοδος Arrays.copyOfRange () χρησιμοποιείται ειδικά όταν θέλετε να αντιγράψετε μερικούς πίνακες. Όπως η μέθοδος copyOf (), αυτή η μέθοδος χρησιμοποιεί επίσης εσωτερικά τη μέθοδο System.arraycopy ().
Το πρωτότυπο της μεθόδου Arrays.copyOfRange () έχει ως εξής:
public static short() copyOfRange(short() original, int from, int to)
που,
- πρωτότυπο: Ο πίνακας από τον οποίο πρόκειται να αντιγραφεί μια περιοχή.
- από: Αρχικός δείκτης του εύρους που θα αντιγραφεί, συμπεριλαμβανομένων.
- προς την: Ο τελικός δείκτης του εύρους που θα αντιγραφεί, αποκλειστικός.
Ένα παράδειγμα εφαρμογής της μεθόδου copyOfRange παρουσιάζεται παρακάτω.
import java.util.Arrays; class Main { public static void main(String args()) { int intArray() = { 10,20,30,40,50 }; // to index is within the range int() copyArray = Arrays.copyOfRange(intArray, 2, 6); System.out.println('Array copy with both index within the range: ' + Arrays.toString(copyArray)); //to index is out of range int() copy1 = Arrays.copyOfRange(intArray, 4, intArray.length + 3); System.out.println('Array copy with to index out of range: ' + Arrays.toString(copy1)); } }
Παραγωγή:

Χρήση Object.clone ()
Ο πίνακας Java εφαρμόζει εσωτερικά μια διασύνδεση Cloneable και έτσι είναι εύκολο να κλωνοποιηθεί ένας πίνακας Java. Μπορείτε να κλωνοποιήσετε μονοδιάστατες καθώς και δισδιάστατες συστοιχίες. Όταν κλωνοποιείτε έναν μονοδιάστατο πίνακα, δημιουργεί ένα βαθύ αντίγραφο των στοιχείων πίνακα που αντιγράφει τις τιμές.
Από την άλλη πλευρά, όταν κλωνοποιείτε δισδιάστατες ή πολυδιάστατες συστοιχίες, δημιουργείται ένα ρηχό αντίγραφο στοιχείων, δηλαδή αντιγράφονται μόνο αναφορές. Αυτή η κλωνοποίηση των συστοιχιών γίνεται με τη μέθοδο «Clone ()» που παρέχεται από τις συστοιχίες.
Ένα βαθύ αντίγραφο των 1-D συστοιχιών ως αποτέλεσμα της κλωνοποίησης μπορεί να αναπαρασταθεί ως εξής:

Τώρα ας εφαρμόσουμε την κλωνοποίηση πίνακα 1-D σε ένα πρόγραμμα Java.
class Main { public static void main(String args()) { int num_Array() = {5,10,15,20,25,30}; int clone_Array() = num_Array.clone(); System.out.println('Original num_Array:'); for (int i = 0; i Όπως μπορείτε να δείτε στην έξοδο, η έκφραση για έλεγχο της ισότητας και των δύο συστοιχιών επιστρέφει ψευδής. Αυτό συμβαίνει επειδή η κλωνοποίηση ενός μονοδιάστατου πίνακα έχει ως αποτέλεσμα βαθύ αντίγραφο όπου οι τιμές αντιγράφονται σε έναν νέο πίνακα και όχι απλώς αναφορές.
Συχνές Ερωτήσεις
Ε # 1) Πώς να δημιουργήσετε ένα αντίγραφο ενός πίνακα στην Java;
Απάντηση: Υπάρχουν διαφορετικές μέθοδοι για την αντιγραφή ενός πίνακα.
- Μπορείτε να χρησιμοποιήσετε ένα για βρόχο και να αντιγράψετε στοιχεία το ένα προς το άλλο ένα προς ένα.
- Χρησιμοποιήστε τη μέθοδο κλώνου για να κλωνοποιήσετε έναν πίνακα.
- Χρησιμοποιήστε τη μέθοδο arraycopy () της κλάσης συστήματος.
- Χρησιμοποιήστε τις μεθόδους copyOf () ή copyOfRange () της κλάσης Arrays.
Ε # 2) Πώς εκχωρείτε έναν πίνακα σε έναν άλλο;
Απάντηση: Μπορείτε να αντιστοιχίσετε τον πίνακα σε έναν άλλο χρησιμοποιώντας έναν απλό τελεστή ανάθεσης (=). Πρέπει να βεβαιωθείτε ότι οι δύο πίνακες έχουν τον ίδιο τύπο δεδομένων και έχουν την ίδια διάσταση.
Q # 3) Τι είναι ένα ρηχό αντίγραφο και ένα βαθύ αντίγραφο;
Απάντηση: Σε ρηχό αντίγραφο, αντιγράφονται μόνο τα χαρακτηριστικά αντικειμένων ή συστοιχιών. Έτσι, τυχόν αλλαγές στον αντιγραμμένο πίνακα θα αντικατοπτρίζονται στο πρωτότυπο. Η κλωνοποίηση Java είναι ένα παράδειγμα ενός ρηχού αντιγράφου.
εικονική πραγματικότητα συμβατή με το xbox one
Ένα βαθύ αντίγραφο είναι αυτό όπου χρειαζόμαστε ένα πλήρες αντίγραφο του αντικειμένου, έτσι ώστε όταν κλωνοποιούμε ή αντιγράφουμε αυτό το αντικείμενο, είναι ένα ανεξάρτητο αντίγραφο. Όταν πρόκειται για πρωτόγονους ή ενσωματωμένους τύπους, δεν υπάρχει διαφορά μεταξύ του ρηχού και του βαθιού αντιγράφου.
Q # 4) Τι κάνει ένας κλώνος Array;
Απάντηση: Η μέθοδος κλωνοποίησης των συστοιχιών χρησιμοποιείται για την αντιγραφή των χαρακτηριστικών ενός αντικειμένου σε ένα άλλο. Χρησιμοποιεί ένα ρηχό αντίγραφο για να το κάνει αυτό.
Ε # 5) Μπορείτε να αποθηκεύσετε ένα Array σε ένα Array;
Απάντηση: Οι πίνακες μπορούν να περιέχουν πίνακες που παρέχονται με τα στοιχεία του ίδιου τύπου (πρωτόγονο ή αντικείμενο). Αυτό σημαίνει ότι δεν μπορείτε να αποθηκεύσετε έναν ακέραιο πίνακα σε έναν πίνακα συμβολοσειρών.
συμπέρασμα
Σε αυτό το σεμινάριο, διερευνήσαμε συστοιχίες αντιγράφων και συστοιχίες κλώνων στην Java. Έχουμε δει διάφορες μεθόδους / προσεγγίσεις για αντιγραφή και κλωνοποίηση ενός πίνακα.
Σημειώστε ότι οι περισσότερες από αυτές τις μεθόδους εφαρμόζουν ένα ρηχό αντίγραφο. Για πρωτόγονους τύπους δεδομένων, το ρηχό και το βαθύ αντίγραφο δεν διαφέρει. Αλλά όταν ένας πίνακας περιέχει αντικείμενα ή αναφορές, ο προγραμματιστής πρέπει να εφαρμόσει ένα σε βάθος αντίγραφο σύμφωνα με τις απαιτήσεις.
Στα επόμενα σεμινάριά μας, συνεχίζουμε να διερευνούμε περισσότερα για τους πίνακες Java.
=> Διαβάστε ολόκληρη τη σειρά Easy Java Training.
Συνιστώμενη ανάγνωση
- Εκμάθηση μήκους σειράς Java με παραδείγματα κώδικα
- Java Generic Array - Πώς να προσομοιώσετε γενικές συστοιχίες στην Java;
- Java Array - Πώς να εκτυπώσετε στοιχεία ενός πίνακα στην Java;
- Πολυδιάστατες συστοιχίες σε Java (2η και τρισδιάστατη σειρά σε Java)
- Πώς να περάσετε / επιστρέψετε μια σειρά στην Java
- Πώς να ταξινομήσετε μια σειρά σε Java - Tutorial με παραδείγματα
- Java Array - Δήλωση, δημιουργία και αρχικοποίηση μιας σειράς στην Java
- Κατάργηση / διαγραφή στοιχείου από μια σειρά στην Java