Συστοιχία αντικειμένων σε Java

⚡ Έξυπνη Σύνοψη

Συστοιχία αντικειμένων σε Java Αποθηκεύει αναφορές αντικειμένων σε μια συνεχόμενη υποδοχή σταθερού μεγέθους, επιτρέποντας σε μια μεμονωμένη μεταβλητή να διατηρεί πολλές παρουσίες μιας κλάσης και να έχει πρόσβαση σε καθεμία μέσω ενός ευρετηρίου για επανάληψη, μετάλλαξη και μετάδοση σε μεθόδους.

  • 📦 Αποθήκευση αναφοράς: Κάθε υποδοχή σε ένα Java πίνακας αντικειμένων περιέχει μια αναφορά σε ένα αντικείμενο, όχι στο ίδιο το αντικείμενο, παρόμοια με οποιαδήποτε μεταβλητή αντικειμένου στο Java.
  • 🧱 Δημιουργία σε δύο βήματα: Κατανείμετε στον πίνακα τη νέα τιμή ClassName[size] και, στη συνέχεια, κατανείμετε σε κάθε αντικείμενο τη νέα τιμή ClassName() πριν καλέσετε μεθόδους σε αυτό.
  • ⚠️ Εξαίρεση NullPointer: Κάθε υποδοχή ξεκινά ως null. Η κλήση μιας μεθόδου σε μια μη αρχικοποιημένη υποδοχή δημιουργεί την συνάρτηση NullPointerException κατά τον χρόνο εκτέλεσης.
  • 🔁 Επανάληψη: Χρησιμοποιήστε έναν βρόχο for με μήκος πίνακα ή έναν ενισχυμένο βρόχο for για να εκτελέσετε περπατήματα σε κάθε αντικείμενο στον πίνακα.
  • 📏 Σταθερό μέγεθος: Ένας πίνακας δεν μπορεί να αυξηθεί μετά την κατανομή. Χρησιμοποιήστε το ArrayList όταν ο αριθμός των αντικειμένων αλλάζει κατά τον χρόνο εκτέλεσης.
  • Αρχικοποίηση κατασκευαστή: Οι κατασκευαστές που περνούν ενσωματωμένα κατά τη δημιουργία παρέχουν συντομότερη και ασφαλέστερη ρύθμιση από τις κλήσεις του ρυθμιστή μετά την εκτέλεση.
  • 🚚 Παράμετρος μεθόδου: Η διαβίβαση του πίνακα σε μια μέθοδο μεταφέρει μια αναφορά, έτσι ώστε οι αλλαγές μέσα στη μέθοδο να είναι ορατές στον καλούντα.

Συστοιχία αντικειμένων σε 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 κατά το χρόνο εκτέλεσης.

Java Πίνακας μεταβλητών αναφοράς αντικειμένων

Βήμα 5) Αποσχολιάστε τις γραμμές 4 και 5. Αυτές οι δύο γραμμές δημιουργούν πραγματικό Account αντικείμενα και να τα αντιστοιχίσετε σε obj[0] και obj[1]Ο πίνακας πλέον περιέχει πραγματικές αναφορές και ο κώδικας εκτελείται ομαλά.

Java Πίνακας αντικειμένων που συμπληρώθηκαν

Παραγωγή:

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

Πέρα από την αρχικοποίηση που βασίζεται σε οριστές που φαίνεται παραπάνω, μια σειρά αντικειμένων μπορεί να αρχικοποιηθεί με τρεις πιο καθαρούς τρόπους. Κάθε στυλ ανταλλάσσει την πολυλογία για λόγους σαφήνειας, οπότε επιλέξτε αυτό που ταιριάζει καλύτερα στην περίσταση.

  1. Αρχικοποίηση βρόχου — κατανείμετε τον πίνακα, στη συνέχεια, εκτελέστε μια περιήγηση σε κάθε δείκτη και αντιστοιχίστε ένα νέο αντικείμενο. Αυτό είναι το τυπικό μοτίβο για μεγάλους πίνακες ή όταν ο αριθμός των αντικειμένων είναι δυναμικός.
  2. Αρχικοποίηση κατασκευαστή — μεταβίβαση τιμών απευθείας στον κατασκευαστή κατά τη στιγμή της δημιουργίας, επομένως δεν απαιτείται ξεχωριστή κλήση οριστή.
  3. Αρχικοποίηση κυριολεκτικής διάταξης πίνακα — δηλώστε και συμπληρώστε σε μία μόνο πρόταση με ένα ενσωματωμένο { ... } αρχικοποιητής, ιδανικός για μικρά σταθερά σετ.
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 στον περισσότερο καθημερινό κώδικα εφαρμογών, επειδή η δυνατότητα προσθήκης και αφαίρεσης χωρίς ανακατανομή αντισταθμίζει τη μικρή επιβάρυνση ανά στοιχείο.

Συχνές Ερωτήσεις

Μια σειρά από αντικείμενα σε Java είναι ένα κοντέινερ σταθερού μεγέθους που αποθηκεύει αναφορές σε στιγμιότυπα της ίδιας κλάσης. Κάθε υποδοχή δείχνει σε ένα αντικείμενο στο σωρό και η πρόσβαση στα στοιχεία γίνεται μέσω ευρετηρίου που βασίζεται στο μηδέν χρησιμοποιώντας αγκύλες.

Δηλώστε τον πίνακα με ClassName[] arr = new ClassName[size] και, στη συνέχεια, δημιουργήστε κάθε αντικείμενο με new ClassName() σε έναν βρόχο ή με μια ενσωματωμένη κυριολεκτική γραμμή πίνακα. Απαιτούνται και τα δύο βήματα. Το πρώτο εκχωρεί μόνο θέσεις αναφοράς.

Επειδή η νέα ClassName[size] εκχωρεί μόνο τον ίδιο τον πίνακα. Κάθε υποδοχή ξεκινά ως null, επομένως η κλήση οποιασδήποτε μεθόδου σε αυτήν την υποδοχή δημιουργεί NullPointerException. Διορθώστε το αντιστοιχίζοντας μια νέα ClassName() σε κάθε ευρετήριο πριν από τη χρήση.

Ένας πίνακας έχει ένα σταθερό μέγεθος που επιλέγεται κατά τη δημιουργία, ενώ το ArrayList μεγαλώνει και συρρικνώνεται αυτόματα. Οι πίνακες παρέχουν ελαφρώς ταχύτερες αναγνώσεις με ευρετήριο. Το ArrayList προσθέτει βολικές μεθόδους προσθήκης, αφαίρεσης και ροής για τον καθημερινό κώδικα εφαρμογών.

Χρησιμοποιήστε έναν κλασικό βρόχο for με arr.length όταν χρειάζεστε τον δείκτη ή έναν βελτιωμένο βρόχο for-each για απλή επανάληψη. Για φιλτράρισμα ή μετασχηματισμό, τυλίξτε τον πίνακα με το Arrays.stream(arr) και σχηματίστε μια αλυσίδα στον αγωγό που χρειάζεστε.

Δηλώστε την παράμετρο ως ClassName[] name και, στη συνέχεια, καλέστε τη μέθοδο με τη μεταβλητή πίνακα. Java μεταβιβάζει την αναφορά πίνακα κατά τιμή, επομένως οι μεταλλάξεις στα πεδία στοιχείων μέσα στη μέθοδο είναι ορατές στον καλούντα.

Οι γεννήτριες κώδικα μηχανικής μάθησης αναγνωρίζουν το μοτίβο κατανομής δύο βημάτων και συμπληρώνουν τις νέες γραμμές ClassName() που λείπουν και τις οποίες ξεχνούν οι αρχάριοι. Προτείνουν επίσης το ArrayList όταν το μέγεθος της συλλογής-στόχου είναι άγνωστο, μειώνοντας τα σφάλματα NullPointerException.

Ναι. Το GitHub Copilot δημιουργεί δηλώσεις πινάκων, βρόχους κατασκευής, μπλοκ επανάληψης και μετατροπές ArrayList από ένα σχόλιο που περιγράφει το μοντέλο τομέα. RevΔείτε τον δημιουργημένο κώδικα για σωστά ορίσματα κατασκευαστή και ασφαλή χειρισμό null πριν από τη χρήση.

Συνοψίστε αυτήν την ανάρτηση με: