Cześć! Wcześniej podczas szkolenia pracowaliśmy z pojedynczymi obiektami (lub typami pierwotnymi). Co jednak, jeśli potrzebujemy pracować nie z jednym obiektem, ale z całą grupą? Przykładowo chcemy stworzyć listę urodzin wszystkich pracowników naszej firmy. Powinien zawierać powiedzmy 30 wierszy w formacie: „Andriej Pietrow, 25 stycznia”. Pomoże nam w tym specjalna struktura danych, tablica. Jeśli porównasz tablicę z obiektami z prawdziwego życia, jej struktura jest bardzo podobna do skarbca bankowego z komórkami: Tablica również składa się z komórek. Możesz umieścić coś w każdej komórce. W takim przypadku, aby uzyskać dostęp do treści, musisz znać numer komórki. Tablica jest tworzona w następujący sposób:
public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10]; // tablica napisów Java
}
}
Tutaj stworzyliśmy tablicę składającą się z 10 komórek. Możesz od razu zwrócić uwagę na niektóre cechy tablicy:
- Przechowuje dane ściśle określonego typu. Jeśli początkowo utworzyliśmy tablicę ciągów
String
, nie będziemy mogli przechowywać w niej niczego innego. Typ danych jest określany podczas tworzenia tablicy. To właśnie odróżnia ją od skrytki depozytowej, w której klient może przechowywać co mu się podoba. - Tablica może przechowywać dane typów pierwotnych (na przykład
int
), ciągi znaków (String
) lub obiekty tej samej klasy. Dokładniej, nawet nie same obiekty, ale linki do tych obiektów. - Rozmiar tablicy należy określić podczas tworzenia. Nie będzie można go później określić ani zmienić jego rozmiaru po utworzeniu.
[]
po obu stronach wyrażenia. Można je podać przed nazwą zmiennej referencyjnej lub po niej – będzie to działać w obie strony:
//Java tablice ciągów znaków, dwie składnie
String [] birthdays = new String[10];
String birthdays [] = new String[10];
Jeśli chcesz zapisać coś do tablicy, musisz podać numer komórki, w której zostanie zapisana wartość. Numery komórek tablicy zaczynają się od 0. Rozpoczęcie od zera jest powszechną praktyką w programowaniu. Im szybciej się do tego przyzwyczaisz, tym lepiej :) Oznacza to, że jeśli chcesz umieścić jakąś wartość w pierwszej komórce tablicy , robisz to w ten sposób:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = „Lena Eliseeva, 12 marca”;
}
}
Teraz pierwsza komórka naszej tablicy, która zawiera daty urodzin kolegów, zawiera ciąg znaków z datą urodzin Leny. Analogicznie możesz dodać inne wartości:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = „Lena Eliseeva, 12 marca”;
birthdays[1] = „Kolya Romanov, 18 maja”;
birthdays[7] = „Olesia Ostapenko, 3 stycznia”;
}
}
Uwaga: do ósmej komórki dodaliśmy urodziny Olesi (zapomnialiście, dlaczego komórka nr 7 jest ósma?). Chociaż wszystkie pozostałe komórki nie są wypełnione. Nie ma konieczności wpisywania wartości do tablicy po kolei – nie ma takiego ograniczenia. Z drugiej strony, jeśli napiszesz po kolei, znacznie łatwiej będzie śledzić liczbę wolnych i zajętych komórek, a w tablicy nie zostaną „dziury”. Jeśli chcesz uzyskać zawartość komórki tablicowej, tak jak w przypadku komórki bankowej, musisz znać jej numer. Odbywa się to w następujący sposób:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = „Lena Eliseeva, 12 marca”;
birthdays[1] = „Kolya Romanov, 18 maja”;
birthdays[7] = „Olesia Ostapenko, 3 stycznia”;
String olesyaBirthday = birthdays[7];
System.out.println(olesyaBirthday);
}
}
Wyjście konsoli:
Олеся Остапенко, 3 января
Stworzyliśmy zmienną String
i powiedzieliśmy kompilatorowi: „Znajdź w tablicy komórkę o indeksie 7 birthdays
i przypisz do zmiennej przechowywaną tam wartość String
olesyaBirthday
”. To jest dokładnie to, co zrobił.
Długość tablicy Java
Pracując z tablicą, możesz łatwo sprawdzić jej długość, korzystając ze specjalnej właściwości -length
.
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = „Lena Eliseeva, 12 marca”;
birthdays[1] = „Kolya Romanov, 18 maja”;
birthdays[7] = „Olesia Ostapenko, 3 stycznia”;
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
Wyjście konsoli:
10
Notatka:Właściwość length
przechowuje rozmiar tablicy, a nie liczbę wypełnionych komórek. Nasza tablica przechowuje tylko 3 wartości, ale kiedy ją tworzyliśmy, określiliśmy dla niej rozmiar = 10. Jest to wartość zwracana przez pole length
. Dlaczego może się to przydać? Cóż, jeśli na przykład chcesz wydrukować na konsoli listę wszystkich urodzin (aby sprawdzić, czy nikt nie został zapomniany), możesz to zrobić w jednej prostej pętli:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = „Lena Eliseeva, 12 marca”;
birthdays[1] = „Kolya Romanov, 18 maja”;
birthdays[2] = „Wika Ignatowa, 12 lipca”;
birthdays[3] = „Denis Kozlov, 7 września”;
birthdays[4] = „Maksym Maslennikow, 9 listopada”;
birthdays[5] = „Roman Baranow, 14 sierpnia”;
birthdays[6] = „Walerij Piatkina, 1 kwietnia”;
birthdays[7] = „Olesia Ostapenko, 3 stycznia”;
birthdays[8] = „Kostya Gurko, 19 października”;
birthdays[9] = „Sierioża Naumow, 3 maja”;
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
W pętli tworzymy zmienną i
, która początkowo będzie równa zeru. Przy każdym przebiegu pobieramy komórkę o indeksie i z naszej tablicy i wypisujemy jej wartość na konsoli. Pętla wykona 10 iteracji, a wartości i wzrosną od 0 do 9 - właśnie według indeksów komórek naszej tablicy! W ten sposób wypiszemy na konsolę wszystkie wartości od birthdays[0]
do birthdays[9]
. Tak naprawdę istnieją sposoby na utworzenie tablicy w inny sposób. Na przykład tablicę liczb int
można utworzyć w następujący sposób:
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
Ta metoda nazywa się „szybką inicjalizacją”. Jest to całkiem wygodne, ponieważ od razu tworzymy tablicę i wypełniamy ją wartościami. Nie ma potrzeby jawnego określania rozmiaru tablicy - pole length
zostanie wypełnione automatycznie podczas szybkiej inicjalizacji.
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
System.out.println(numbers.length);
}
}
Wyjście konsoli:
9
Tablica obiektów Java
Słyszałeś już, że tablice obiektów i tablice prymitywów są przechowywane w pamięci inaczej. Weźmy na przykład tablicę trzech obiektówCat
:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Tomasz");
cats[1] = new Cat("Hipopotam");
cats[2] = new Cat(„Filip Markowicz”);
}
}
Jest tu kilka rzeczy do zrozumienia:
- W przypadku prymitywów tablice Java przechowują wiele określonych wartości (takich jak liczby
int
). W przypadku obiektów tablica przechowuje wiele odniesień. Tablicacats
składa się z trzech komórek, z których każda zawiera odwołanie do obiektuCat
. Każde z łączy wskazuje adres w pamięci, w którym przechowywany jest ten obiekt. - Elementy tablicy są przechowywane w pamięci w jednym bloku. Ma to na celu sprawniejszy i szybszy dostęp do nich. Zatem łącze
cats
wskazuje na blok w pamięci, w którym przechowywane są wszystkie obiekty – elementy tablicy. Acats[0]
- na konkretny adres w tym bloku.
Tablica tablic lub tablica dwuwymiarowa
Na tej podstawie stajemy przed pytaniem – czy możemy stworzyć np. nie tablicę ciągów lub liczb, ale tablicę tablic? A odpowiedź będzie brzmiała – tak, możemy! Tablica może przechowywać w sobie dowolne obiekty, łącznie z innymi tablicami. Taka tablica będzie nazywana dwuwymiarową. Jeśli przedstawisz go na zdjęciu, będzie wyglądał bardzo podobnie do zwykłego stołu. Na przykład chcemy utworzyć tablicę, która będzie przechowywać 3 tablice liczbint
po 10 komórek każda. Będzie to wyglądać tak: Każda linia reprezentuje tablicę liczb int
. Pierwsza tablica zawiera liczby od 1 do 10, druga - od -1 do -10, trzecia - zbiór liczb losowych. Każda z tych tablic jest przechowywana w komórce naszej dwuwymiarowej tablicy. Inicjowanie tablicy dwuwymiarowej w kodzie wygląda następująco:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
}
Nasza dwuwymiarowa tablica kotów przechowuje 3 tablice po 5 komórek każda. Jeśli chcemy umieścić nasz obiekt w trzeciej komórce drugiej tablicy, robimy to w następujący sposób:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
cats[1][2] = new Cat("Puch");
}
[1]
wskazuje drugą tablicę i [2]
wskazuje trzecią komórkę tej tablicy. Ponieważ tablica dwuwymiarowa składa się z kilku tablic, aby ją przejść i wydrukować wszystkie wartości na konsolę (lub wypełnić wszystkie komórki), potrzebujemy podwójnej, zagnieżdżonej pętli:
for (int i = 0; i < cats.length; i++) {
for (int j = 0; j < cats[i].length; j++) {
System.out.println(cats[i][j]);
}
}
W pętli zewnętrznej (zmienna i
) na zmianę przechodzimy przez wszystkie tablice tworzące naszą dwuwymiarową tablicę. W wewnętrznej pętli (zmienna j
) iterujemy po wszystkich komórkach każdej tablicy. W rezultacie obiekt cats[0][0]
(pierwsza tablica, pierwsza komórka) zostanie wyświetlony jako pierwszy na konsoli, a drugi obiekt cats[0][1]
(pierwsza tablica, druga komórka). Kiedy pierwsza tablica się wyczerpie, na wyjściu zostaną wyświetlone , cats[1][0]
, cats[1][1]
i tak dalej. cats[1][2]
Nawiasem mówiąc, szybka inicjalizacja jest również dostępna dla tablic dwuwymiarowych:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Zwykle tablicę dwuwymiarową zapisalibyśmy numbers
jako int[3][3]
, ale ta metoda pozwala nam natychmiast określić wartości. Dlaczego tablica dwuwymiarowa może być potrzebna? Cóż, na przykład za jego pomocą można łatwo odtworzyć słynną grę „Battleship”: Struktura pola gry w „Battleship” jest taka, że można ją łatwo opisać: dwuwymiarowa tablica 10 tablic po 10 komórek każda . Tworzysz dwie takie tablice – dla siebie i przeciwnika:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
Wypełniasz pewnymi wartościami (na przykład liczbami lub znakami *
) komórki, w których znajdują się twoje statki, a następnie ty i twój przeciwnik na zmianę wywołujecie numery komórek:
- bitwa morska[6] [5]!
- Przeszłość! bitwa morska2[6][6]!
- Ranny!
- bitwa morska2[6][7]!
- Ranny!
- bitwa morska2[6] [8]!,
- Zabity!
Dodatkowe zasoby na temat tablic
Chcesz wiedzieć więcej o tablicach? Zapraszamy do zapoznania się z poniższymi artykułami. Istnieje wiele ciekawych i przydatnych informacji na ten temat.- Tablice w Javie - szczegółowy artykuł o tablicach, ich tworzeniu, inicjalizacji i użyciu. Z przykładami.
- Klasa Arrays i jej zastosowanie - w artykule opisano niektóre metody tej klasy
Array
- Arrays to pierwszy wykład JavaRush poświęcony tablicom.
- Tablice wielowymiarowe - szczegółowy artykuł o tablicach wielowymiarowych z przykładami.
- Zwróć tablicę o zerowej długości, a nie null — autor efektywnego programowania, Joshua Bloch, mówi o tym, jak lepiej zwracać puste tablice.
GO TO FULL VERSION