Συστοιχία αντικειμένων σε Java
⚡ Έξυπνη Σύνοψη
Συστοιχία αντικειμένων σε Java Αποθηκεύει αναφορές αντικειμένων σε μια συνεχόμενη υποδοχή σταθερού μεγέθους, επιτρέποντας σε μια μεμονωμένη μεταβλητή να διατηρεί πολλές παρουσίες μιας κλάσης και να έχει πρόσβαση σε καθεμία μέσω ενός ευρετηρίου για επανάληψη, μετάλλαξη και μετάδοση σε μεθόδους.
Τι είναι ένας πίνακας αντικειμένων στο Java?
A Java συστοιχία αντικειμένων αποθηκεύει πολλαπλές παρουσίες αντικειμένων της ίδιας κλάσης σε ένα μόνο κοντέινερ σταθερού μεγέθους. Σε αντίθεση με έναν πρωτόγονο πίνακα που αποθηκεύει τιμές όπως int, doubleΤο HIFU, ή Υψηλής Έντασης Εστιασμένος Υπέρηχος, στοχεύει επίσης στο πρόσωπο και τον λαιμό. Προσφέρει θεραπεία σε γρήγορες εκπομπές, γεγονός που κάνει τις συνεδρίες θεραπείας συντομότερες. boolean απευθείας σε κάθε υποδοχή, αποθηκεύεται μια σειρά από αντικείμενα αναφορέςΚάθε υποδοχή δείχνει τη θέση μνήμης ενός αντικειμένου και το ίδιο το αντικείμενο βρίσκεται σε αυτήν. Java σωρός.
Αυτή η διάταξη ταιριάζει με τον τρόπο που λειτουργεί οποιοδήποτε αντικείμενο μεταβλητή in Java λειτουργεί. Ο πίνακας απλώς ομαδοποιεί αρκετές αναφορές αντικειμένων, ώστε να μπορείτε να έχετε πρόσβαση σε αυτές μέσω ευρετηρίου. Είναι η φυσική επιλογή όταν ο αριθμός των αντικειμένων είναι γνωστός εκ των προτέρων και δεν αλλάζει κατά τη διάρκεια ζωής του προγράμματος.
Σύνταξη
ClassName[] obj = new ClassName[array_length];
Η δεξιά πλευρά διαθέτει χώρο για array_length αναφορές, όλες αρχικοποιημένες σε nullΚανένα αντικείμενο ClassName υπάρχει ακόμη, μόνο το κοντέινερ που μπορεί να περιέχει αναφορές σε τέτοια αντικείμενα.
Πώς να δημιουργήσετε έναν πίνακα αντικειμένων σε Java
Η δημιουργία ενός λειτουργικού πίνακα αντικειμένων απαιτεί πάντα δύο βήματα κατανομής. Το πρώτο εκχωρεί το κοντέινερ αναφοράς και το δεύτερο εκχωρεί κάθε αντικείμενο στο οποίο θα δείχνει το κοντέινερ. Παράλειψηping το δεύτερο βήμα είναι η πιο κοινή πηγή NullPointerException σε αρχάριο Java κώδικας.
Βήμα 1) Ανοίξτε σας editor κώδικα και αντιγράψτε τον ακόλουθο κώδικα:
class ObjectArray { public static void main(String args[]) { Account obj[] = new Account[2]; // obj[0] = new Account(); // obj[1] = new Account(); obj[0].setData(1, 2); obj[1].setData(3, 4); System.out.println("For Array Element 0"); obj[0].showData(); System.out.println("For Array Element 1"); obj[1].showData(); } } class Account { int a; int b; public void setData(int c, int d) { a = c; b = d; } public void showData() { System.out.println("Value of a = " + a); System.out.println("Value of b = " + b); } }
Βήμα 2) Αποθηκεύστε το αρχείο ως ObjectArray.java, στη συνέχεια μεταγλωττίστε το και εκτελέστε το.
Βήμα 3) Σημειώστε το σφάλμα. Προσπαθήστε να το εντοπίσετε πριν συνεχίσετε στο Βήμα 4.
Βήμα 4) Επιθεωρήστε τη γραμμή Account obj[] = new Account[2];Κατανέμει έναν πίνακα δύο μεταβλητών αναφοράς τύπου Account, αλλά δεν διαθέτει καμία Account αντικείμενα. Και οι δύο υποδοχές συγκρατούν null, και καλώντας obj[0].setData(...) για μια null η αναφορά ρίχνει ένα NullPointerException κατά το χρόνο εκτέλεσης.
Βήμα 5) Αποσχολιάστε τις γραμμές 4 και 5. Αυτές οι δύο γραμμές δημιουργούν πραγματικό Account αντικείμενα και να τα αντιστοιχίσετε σε obj[0] και obj[1]Ο πίνακας πλέον περιέχει πραγματικές αναφορές και ο κώδικας εκτελείται ομαλά.
Παραγωγή:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Πώς να αρχικοποιήσετε έναν πίνακα αντικειμένων σε Java
Πέρα από την αρχικοποίηση που βασίζεται σε οριστές που φαίνεται παραπάνω, μια σειρά αντικειμένων μπορεί να αρχικοποιηθεί με τρεις πιο καθαρούς τρόπους. Κάθε στυλ ανταλλάσσει την πολυλογία για λόγους σαφήνειας, οπότε επιλέξτε αυτό που ταιριάζει καλύτερα στην περίσταση.
- Αρχικοποίηση βρόχου — κατανείμετε τον πίνακα, στη συνέχεια, εκτελέστε μια περιήγηση σε κάθε δείκτη και αντιστοιχίστε ένα νέο αντικείμενο. Αυτό είναι το τυπικό μοτίβο για μεγάλους πίνακες ή όταν ο αριθμός των αντικειμένων είναι δυναμικός.
- Αρχικοποίηση κατασκευαστή — μεταβίβαση τιμών απευθείας στον κατασκευαστή κατά τη στιγμή της δημιουργίας, επομένως δεν απαιτείται ξεχωριστή κλήση οριστή.
- Αρχικοποίηση κυριολεκτικής διάταξης πίνακα — δηλώστε και συμπληρώστε σε μία μόνο πρόταση με ένα ενσωματωμένο
{ ... }αρχικοποιητής, ιδανικός για μικρά σταθερά σετ.
class Account { int a, b; public Account(int a, int b) { // constructor this.a = a; this.b = b; } } public class InitDemo { public static void main(String[] args) { // 1) Loop initialisation Account[] loopArr = new Account[3]; for (int i = 0; i < loopArr.length; i++) { loopArr[i] = new Account(i, i * 10); } // 2) Constructor initialisation, one slot at a time Account[] ctorArr = new Account[2]; ctorArr[0] = new Account(1, 2); ctorArr[1] = new Account(3, 4); // 3) Array literal initialisation Account[] litArr = { new Account(5, 6), new Account(7, 8), new Account(9, 10) }; System.out.println("loop size = " + loopArr.length); System.out.println("ctor size = " + ctorArr.length); System.out.println("literal size= " + litArr.length); } }
Η αρχικοποίηση βρόχου είναι η ασφαλέστερη προεπιλογή επειδή εγγυάται ότι δεν θα μείνει καμία θέση nullΗ αρχικοποίηση του κατασκευαστή καθιστά σαφή την πρόθεση όταν κάθε αντικείμενο χρειάζεται διαφορετικά ορίσματα και τα literals του πίνακα διατηρούν τον μικρό κώδικα επίδειξης συμπαγή. Μην αναμειγνύετε στυλ μέσα στον ίδιο πίνακα, εκτός αν έχετε κάποιον λόγο: η συνέπεια διευκολύνει τον εντοπισμό σφαλμάτων.
Επανάληψη και Πρόσβαση σε Στοιχεία σε ένα Java Συστοιχία αντικειμένων
Μόλις συμπληρωθεί ένας πίνακας αντικειμένων, τρία μοτίβα καλύπτουν σχεδόν κάθε ανάγκη πρόσβασης. Επιλέξτε το στυλ βρόχου που ταιριάζει με τον έλεγχο που χρειάζεται ο κώδικας πάνω στο ευρετήριο.
ΚΛΑΣΣΙΚΑ for βρόχος Παρέχει πρόσβαση στο ευρετήριο, το οποίο είναι χρήσιμο για την αντικατάσταση στοιχείων, τη σύγκριση γειτόνων ή την επανάληψη μιας υποπεριοχής.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Ενισχυμένη for βρόχος (ο βρόχος «for-each») αποκρύπτει το ευρετήριο και διαβάζεται πιο φυσικά όταν το ευρετήριο δεν είναι απαραίτητο:
for (Account acc : obj) {
acc.showData();
}
Ροές (Java 8 και αργότερα) μετατρέψτε τον πίνακα σε αγωγό, κάτι που είναι χρήσιμο για φιλτράρισμα, mapping, ή συγκέντρωση χωρίς εγγραφή βρόχου:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Για να διαβάσετε ή να ενημερώσετε ένα μεμονωμένο στοιχείο, χρησιμοποιήστε άμεση πρόσβαση στο ευρετήριο, για παράδειγμα obj[1].setData(10, 20)Πάντα να ελέγχετε πρώτα το μήκος με obj.length να αποφύγω ArrayIndexOutOfBoundsExceptionΌταν οποιαδήποτε υποδοχή θα μπορούσε να είναι null, προστατέψτε την πρόσβαση με έναν μηδενικό έλεγχο ή ένα Optional για να διατηρείται το πρόγραμμα σε λειτουργία αντί να καταρρέει.
Πίνακας αντικειμένων έναντι λίστας αντικειμένων σε Java
Μια απλή διάταξη αντικειμένων είναι γρήγορη και προβλέψιμη, αλλά το σταθερό της μέγεθος γίνεται περιορισμός μόλις αλλάξει ο αριθμός των αντικειμένων κατά τον χρόνο εκτέλεσης. Java'S Πλαίσιο συλλογών παρέχει ArrayList ως η δυναμική εναλλακτική λύση. Ο παρακάτω πίνακας επισημαίνει πότε κάθε επιλογή είναι κατάλληλη.
| Χαρακτηριστικό | Συστοιχία αντικειμένων | Λίστα Αντικειμένων με Πίνακα |
|---|---|---|
| Μέγεθος | Διορθώθηκε κατά τη δημιουργία | Μεγαλώνει και συρρικνώνεται αυτόματα |
| Δήλωση | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Στοιχείο πρόσβασης | a[i] | list.get(i) |
| Προσθήκη στοιχείου | Δεν υποστηρίζεται μετά τη δημιουργία | list.add(obj) |
| Τύπος ασφάλειας | Χρόνος μεταγλώττισης που πληκτρολογείται από δήλωση | Γενόσημα που εφαρμόζονται κατά τη στιγμή της μεταγλώττισης |
| 💪 Βελτίωση της απόδοσης στην άσκηση | Οριακά ταχύτερες αναγνώσεις με ευρετήριο | Αποσβεσμένο άθροισμα O(1), κάποια γενικά έξοδα ανά στοιχείο |
| Προτιμάται όταν | Το μέγεθος είναι γνωστό και σταθερό | Το μέγεθος είναι άγνωστο ή αλλάζει κατά τον χρόνο εκτέλεσης |
Χρησιμοποιήστε έναν πίνακα όταν ένα περιορισμένο αποτύπωμα μνήμης και μια προβλέψιμη ευρετηρίαση έχουν σημασία, για παράδειγμα σε διατάξεις πινάκων ή σε hot paths κρίσιμες για την απόδοση. Αναζητήστε ArrayList στον περισσότερο καθημερινό κώδικα εφαρμογών, επειδή η δυνατότητα προσθήκης και αφαίρεσης χωρίς ανακατανομή αντισταθμίζει τη μικρή επιβάρυνση ανά στοιχείο.



