JavaRush /Blog Java /Random-PL /Coś o tablicach w Javie

Coś o tablicach w Javie

Opublikowano w grupie Random-PL
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: Coś o tablicach w Javie - 1Tablica 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:
  1. 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.
  2. 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.
  3. Rozmiar tablicy należy określić podczas tworzenia. Nie będzie można go później określić ani zmienić jego rozmiaru po utworzeniu.
Java wskazuje, że tworzona jest tablica, używając nawiasów kwadratowych []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 :) Coś o tablicach w Javie - 2Oznacza 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ą Stringi powiedzieliśmy kompilatorowi: „Znajdź w tablicy komórkę o indeksie 7 birthdaysi 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ść lengthprzechowuje 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 intmoż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 lengthzostanie 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ów Cat:
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:
  1. W przypadku prymitywów tablice Java przechowują wiele określonych wartości (takich jak liczby int). W przypadku obiektów tablica przechowuje wiele odniesień. Tablica catsskłada się z trzech komórek, z których każda zawiera odwołanie do obiektu Cat. Każde z łączy wskazuje adres w pamięci, w którym przechowywany jest ten obiekt.
  2. Elementy tablicy są przechowywane w pamięci w jednym bloku. Ma to na celu sprawniejszy i szybszy dostęp do nich. Zatem łącze catswskazuje na blok w pamięci, w którym przechowywane są wszystkie obiekty – elementy tablicy. A cats[0]- na konkretny adres w tym bloku.
Coś o tablicach w Javie - 3Ważne jest, aby zrozumieć, że tablica może nie tylko przechowywać obiekty, ale sama jest obiektem.

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 liczb intpo 10 komórek każda. Będzie to wyglądać tak: Coś o tablicach w Javie - 4Każ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 numbersjako 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”: Coś o tablicach w Javie - 5Struktura 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.
  1. Tablice w Javie - szczegółowy artykuł o tablicach, ich tworzeniu, inicjalizacji i użyciu. Z przykładami.
  2. Klasa Arrays i jej zastosowanie - w artykule opisano niektóre metody tej klasyArray
  3. Arrays to pierwszy wykład JavaRush poświęcony tablicom.
  4. Tablice wielowymiarowe - szczegółowy artykuł o tablicach wielowymiarowych z przykładami.
  5. Zwróć tablicę o zerowej długości, a nie null — autor efektywnego programowania, Joshua Bloch, mówi o tym, jak lepiej zwracać puste tablice.
Na tym kończy się nasza pierwsza znajomość tablic, ale to dopiero początek interakcji z nimi. W kolejnych wykładach zobaczymy ciekawe sposoby ich wykorzystania, a także dowiemy się, jakie wbudowane funkcje posiada Java, umożliwiające wygodniejszą pracę z tą strukturą danych :)
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION