Tablica obiektów w Java
⚡ Inteligentne podsumowanie
Tablica obiektów w Java przechowuje odwołania do obiektów w stałym, ciągłym slocie, umożliwiając pojedynczej zmiennej przechowywanie wielu instancji klasy i dostęp do każdej z nich poprzez indeks w celu iteracji, mutacji i przekazywania do metod.
Czym jest tablica obiektów w Java?
A Java tablica obiektów Przechowuje wiele instancji obiektów tej samej klasy w jednym kontenerze o stałym rozmiarze. W przeciwieństwie do tablicy prymitywnej, która przechowuje wartości takie jak int, doublelub boolean bezpośrednio w każdym slocie przechowywana jest tablica obiektów referencjeKażdy slot wskazuje na lokalizację obiektu w pamięci, a sam obiekt znajduje się na Java sterta.
Ten układ pasuje do każdego obiektu zmienna in Java Działa. Tablica po prostu grupuje kilka referencji do obiektów, aby można było uzyskać do nich dostęp za pomocą indeksu. Jest to naturalny wybór, gdy liczba obiektów jest znana z góry i nie zmienia się w trakcie działania programu.
Składnia
ClassName[] obj = new ClassName[array_length];
Prawa strona wyznacza przestrzeń dla array_length odniesienia, wszystkie zainicjowane do null. Żaden obiekt ClassName istnieje jeszcze tylko kontener, który może przechowywać odniesienia do takich obiektów.
Jak utworzyć tablicę obiektów w Java
Utworzenie działającej tablicy obiektów zawsze wymaga dwóch kroków alokacji. Pierwszy z nich to alokacja kontenera referencyjnego, a drugi to alokacja każdego obiektu, na który będzie wskazywał kontener. Pomińping drugi krok jest najczęstszym źródłem NullPointerException dla początkujących Java kod.
Krok 1) Otwórz swoje edytor kodu i skopiuj poniższy kod:
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); } }
Krok 2) Zapisz plik jako ObjectArray.java, a następnie skompiluj i uruchom.
Krok 3) Zanotuj błąd. Spróbuj go zdebugować, zanim przejdziesz do kroku 4.
Krok 4) Sprawdź linię Account obj[] = new Account[2];. Przydziela tablicę dwóch zmiennych referencyjnych typu Account, ale nie przydziela żadnych Account obiekty. Oba sloty mieszczą nulli dzwoniąc obj[0].setData(...) na null odniesienie rzuca NullPointerException W czasie wykonywania.
Krok 5) Odkomentuj wiersze 4 i 5. Te dwa wiersze tworzą prawdziwe Account obiekty i przypisać je do obj[0] oraz obj[1]Tablica zawiera teraz prawdziwe odwołania, a kod działa poprawnie.
Wyjście:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Jak zainicjować tablicę obiektów w Java
Oprócz inicjalizacji opartej na setterach, pokazanej powyżej, tablicę obiektów można zainicjować na trzy bardziej przejrzyste sposoby. Każdy styl rezygnuje z rozwlekłości na rzecz przejrzystości, więc wybierz ten, który najlepiej pasuje do sytuacji.
- Inicjalizacja pętli — przydziel tablicę, a następnie przejrzyj każdy indeks i przypisz nowy obiekt. To standardowy schemat dla dużych tablic lub sytuacji, gdy liczba obiektów jest dynamiczna.
- Inicjalizacja konstruktora — przekazuj wartości bezpośrednio do konstruktora w momencie tworzenia, dzięki czemu nie jest potrzebne oddzielne wywołanie settera.
- Inicjalizacja literału tablicy — zadeklaruj i wypełnij w jednym poleceniu z wbudowanym
{ ... }inicjator, idealny dla małych, stałych zestawów.
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); } }
Inicjalizacja pętli jest najbezpieczniejszą domyślną opcją, ponieważ gwarantuje, że nie zostanie pominięty żaden slot nullInicjalizacja konstruktora sprawia, że intencja jest jawna, gdy każdy obiekt potrzebuje różnych argumentów, a literały tablicowe pozwalają zachować zwartość kodu demonstracyjnego. Nie mieszaj stylów w obrębie tej samej tablicy, chyba że masz ku temu powody: spójność ułatwia wykrycie błędów.
Iterowanie i uzyskiwanie dostępu do elementów w Java Tablica obiektów
Po zapełnieniu tablicy obiektów, trzy wzorce pokrywają niemal wszystkie potrzeby dostępu. Wybierz styl pętli, który odpowiada temu, ile kontroli nad indeksem potrzebuje kod.
Klasyczny for pętla udostępnia dostęp do indeksu, który jest przydatny przy zastępowaniu elementów, porównywaniu sąsiadujących elementów lub iterowaniu podzakresu.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Ulepszone for pętla (pętla „for-each”) ukrywa indeks i odczytuje go bardziej naturalnie, gdy nie jest potrzebny:
for (Account acc : obj) {
acc.showData();
}
Strumienie (Java 8 i nowsze) przekonwertować tablicę na potok, który jest przydatny do filtrowania, mapowaniapinglub agregowanie bez pisania pętli:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Aby odczytać lub zaktualizować pojedynczy element, skorzystaj na przykład z bezpośredniego dostępu do indeksu obj[1].setData(10, 20)Zawsze najpierw sprawdź długość obj.length unikać ArrayIndexOutOfBoundsException. Kiedy jakikolwiek slot może być null, zabezpiecz dostęp za pomocą kontroli zerowej lub Optional aby utrzymać działanie programu, zamiast go zawieszać.
Tablica obiektów kontra lista obiektów ArrayList w Java
Prosta tablica obiektów jest szybka i przewidywalna, ale jej stały rozmiar staje się ograniczeniem, gdy tylko liczba obiektów zmienia się w czasie wykonywania. JavaStruktura kolekcji zapewnia ArrayList jako dynamiczna alternatywa. Poniższa tabela pokazuje, kiedy każdy wybór jest właściwy.
| Cecha | Tablica obiektów | ArrayList obiektów |
|---|---|---|
| Rozmiar | Naprawiono w momencie utworzenia | Rośnie i kurczy się automatycznie |
| Deklaracja | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Element dostępu | a[i] | list.get(i) |
| Dodaj element | Nieobsługiwane po utworzeniu | list.add(obj) |
| Wpisz bezpieczeństwo | Typowanie w czasie kompilacji według deklaracji | Typy generyczne wymuszane w czasie kompilacji |
| Wydajność | Nieznacznie szybsze odczyty indeksowane | Zamortyzowane O(1) dodaje, pewne narzuty na element |
| Preferowane, gdy | Rozmiar jest znany i ustalony | Rozmiar jest nieznany lub zmienia się w czasie wykonywania |
Użyj tablicy, gdy liczy się ograniczona pamięć i przewidywalne indeksowanie, na przykład w układach macierzowych lub ścieżkach krytycznych pod względem wydajności. ArrayList w większości codziennego kodu aplikacji, ponieważ możliwość dodawania i usuwania bez realokacji przeważa nad niewielkim narzutem na element.



