1. Typ tablicyString

Krótko mówiąc, chciałbym porozmawiać o tablicy typu String.

Jak powiedzieliśmy, tablica może być dowolnego typu. Możesz więc utworzyć tablicę typu String. Tak wyglądałby kod, gdybyśmy napisali program, który „wprowadza z klawiatury 10 wierszy i wyświetla je na ekranie w odwrotnej kolejności”.

Scanner console = new Scanner(System.in);
String[] array = new String[10];
for (int i = 0; i < 10; i++)
{
   array[i] = console.nextLine();
}
for (int i = 9; i >= 0; i--)
{
   System.out.println(array[i]);
}
Utworzyć obiekt Scanner
Utworzyć tablicę z 10 elementami
Zapętlić od 0 do 9

Odczytać ciąg znaków z klawiatury i zapisać w następnej komórce tablicy
Zapętlić od 9 do 0

Wyświetlić następną komórkę tablicy

Kod niewiele się zmienił! Musiałem tylko zamienić typ intna String. Cóż, czytając linię z klawiatury, zamień metodę nextInt()na nextLine().


2. Tablica typu Stringw pamięci

I jeszcze jeden przydatny fakt. Rozważ 3 zdjęcia:

Rysunek 1. Jak obiekt Stringznajduje się w pamięci:

Tablica typu String w pamięci

To zdjęcie pochodzi z poprzednich wykładów.

Należy pamiętać, że tekst wiersza nie jest przechowywany bezpośrednio w zmiennej: jest dla niego przydzielony oddzielny blok pamięci. A zmienna typu Stringprzechowuje adres (referencję) do obiektu z tekstem.

Rysunek 2. Jak tablica liczb całkowitych jest umieszczona w pamięci:

Tablica typu String w pamięci

Znany jest również obraz.

Zdjęcie 3 . Jak tablica ciągów znaków jest przechowywana w pamięci:

W jaki sposób tablica String jest przechowywana w pamięci?

Po lewej stronie widzimy zmienną typu array String[](przechowuje adres obiektu array).

W środku znajduje się obiekt array typu String.

A po prawej stronie znajdują się obiekty łańcuchowe, które przechowują niektóre teksty.

Komórki obiektu typu array Stringprzechowują nie same napisy (teksty), ale ich adresy (linki). W taki sam sposób jak Stringadresy linii (tekst) są przechowywane w zmiennych typu.

Należy o tym pamiętać podczas porównywania komórek macierzy:

String[] array = new String[10];

array[1] = "Cześć";
array[2] = array[1];
array[3] = new String("Cześć");
// сравниваем
array[1] == array[2];
array[1] == array[3];
array[1].equals(array[3]);
array[1].equalsIgnoreCase(array[3]);
Utwórz tablicę 10 wierszy

Wprowadź wartości w tablicy



true (referencje są równe)
false (referencje nie są równe)
true (wiersze są równe)
true(ciągi są nadal równe)


3. Szybka inicjalizacja macierzy w Javie

Tablice są bardzo przydatną rzeczą, dlatego programiści Java starali się, aby praca z nimi była jak najbardziej wygodna.

Pierwszą rzeczą, którą zrobili, było uproszczenie inicjalizacji tablicy, wprowadzając do niej wartości początkowe.

W końcu bardzo często oprócz danych, które program skądś odczytuje, do działania potrzebuje również własnych danych wewnętrznych. Na przykład musimy przechowywać w tablicy długości wszystkich miesięcy. Jak może wyglądać ten kod:

int[] months = new int[12];
months[0] = 31; // январь
months[1] = 28; // февраль
months[2] = 31; // март
months[3] = 30; // апрель
months[4] = 31; // май
months[5] = 30; // июнь
months[6] = 31; // июль
months[7] = 31; // август
months[8] = 30; // сентябрь
months[9] = 31; // октябрь
months[10] = 30; // ноябрь
months[11] = 31; // декабрь

Ale jest sposób, aby napisać to krócej - dzięki twórcom Javy:

// длины месяцев года
int[] months = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Możesz po prostu wyświetlić wszystkie wartości tablicy oddzielone przecinkami!

Wygodne, prawda? Ale to nie wszystko.

Okazuje się, że kompilator może określić typ kontenera (obiektu tablicowego) na podstawie typu zmiennej tablicowej. Aby określić długość tablicy, policzenie elementów zapisanych w nawiasach klamrowych jest banalne.

Dlatego ten kod można zapisać jeszcze krócej:

// длины месяцев года
int[] months = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Czy to nie piękno? 🙂

Ta notacja nazywa się „szybką inicjalizacją tablicy”. Nawiasem mówiąc, działa to nie tylko dla typu int...

// имена месяцев года
String[] months = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"};