1 klasaArrays

Jak powiedzieliśmy wcześniej, tablice są bardzo przydatną i często używaną rzeczą w programowaniu.

Twórcy Javy szybko zauważyli, że programiści Javy często piszą ten sam kod podczas pracy z tablicami. Na przykład: „skopiuj część tablicy do innej tablicy”, „wypełnij wszystkie komórki tablicy tymi samymi wartościami”, „wyświetl zawartość tablicy w wygodnej czytelnej formie na ekranie” itp.

Dlatego stworzyli specjalną klasę - Arrays(pełna nazwa java.util.Arrays), w której umieścili najpopularniejsze akcje podczas pracy z tablicami.

Ma wiele metod na każdą okazję, ale na początek rozważymy tylko 10 z nich - najprostszych i najczęściej używanych.


2. MetodaArrays.toString()

Pierwsza metoda, której się przyjrzymy, będzie się nazywać Arrays.toString(). Ale najpierw trochę tła.

Każda tablica w Javie ma metodę toString(), która zwraca „tekstową reprezentację tablicy”. Możesz uzyskać tekstową reprezentację tablicy za pomocą tej konstrukcji:

String str = Nazwa.toString();

Gdzie Nazwajest nazwą zmiennej tablicowej i strjest nazwą zmiennej, która będzie przechowywać reprezentację łańcuchową tablicy.

Ale jeśli spróbujesz wyświetlić tablicę za pomocą metody , najprawdopodobniej zobaczysz coś takiego:System.out.println(Nazwa)

I@37afeb11

Pierwsza litera Ioznacza, że ​​jest to tablica typu int, a kolejne znaki@ wskazują adres tablicy w pamięci. Z jednej strony zmienna tablicowa przechowuje dokładnie te informacje, ale z drugiej strony spodziewaliśmy się czegoś innego, prawda?

Chciałbym zobaczyć wartości, które są w tablicy! Aby dokładnie zobaczyć wartości tablicy, wymyślili Arrays.toString(). Jego wywołanie wygląda następująco:

String str = Arrays.toString(Nazwa);

Przykłady:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
Zmienna strbędzie zawierać wartość ciągu:
"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
Zmienna strbędzie zawierać wartość ciągu:
"[]"
String[] array = {"Cześć", "Jak", "Дела"};
String str = Arrays.toString(array);
Zmienna strbędzie zawierać wartość ciągu:
"[Привет, Как, Дела]"


3. MetodaArrays.deepToString()

Arrays.toString()Ale jeśli spróbujesz streścić (wyświetlić) tablicę dwuwymiarową za pomocą metody , zobaczysz coś znajomego:

[I@37afeb11, I@37afeb21, I@37afeb31]

Chodzi o to, że komórki tablicy dwuwymiarowej przechowują łącza do tablic jednowymiarowych. A w jaki sposób jednowymiarowe tablice są konwertowane na łańcuch? Dokładnie tak, jak widzisz powyżej.

I co robić? Jak uzyskać poprawne wyświetlanie tablicy dwuwymiarowej?

Aby to zrobić, klasa Arraysma inną specjalną metodę - deepToString(). Wywołanie wygląda tak:

String str = Arrays.deepToString(Nazwa);

Możesz przekazać dwuwymiarową, jednowymiarową, trójwymiarową i ogólnie tablicę dowolnego wymiaru do tej metody, a ona zawsze wyświetli elementy tablicy.
Uwaga: metoda Arrays.deepToString()nie działa z jednowymiarowymi tablicami prymitywów (na przykład int[]).

Przykłady:

Integer[] array = {1, 2, 3};
String str = Arrays.deepToString(array);
Zmienna strbędzie zawierać wartość ciągu:
"[1, 2, 3]"
int[][] array = { {1, 1}, {2, 2}, {3, 3} };
String str = Arrays.deepToString(array);
Zmienna strbędzie zawierać wartość ciągu:
"[[1, 1], [2, 2], [3, 3]]"
int[][][] array = { {{1, 2, 3}, {1}}, {{}} };
String str = Arrays.deepToString(array);
Zmienna strbędzie zawierać wartość ciągu:
"[[[1, 2, 3], [1]], [[]]]"


4. MetodaArrays.equals()

Znaleźliśmy wyjście tablic na ekran, ale co z porównywaniem tablic?

Aby porównać ciągi, mieliśmy metody equalsi equalsIgnoreCase, ale jakie metody mają tablice?

Dobrą wiadomością jest to, że tablice mają metodę equals, a złą wiadomością jest to, że nie porównuje ona zawartości tablic. Metoda array equalsrobi to samo co operator ==- porównuje referencje.

Przykłady:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
boolean b = x1 == x2;


false(linki nie są równe)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Metoda equalsarray po prostu porównuje referencje dwóch tablic.

false(linki nie są równe)

I co robić? Jak porównać tablice według ich zawartości?

I znowu z pomocą przychodzi klasa Arrays, a raczej jej metoda, Arrays.equals()której wywołanie wygląda następująco:

Arrays.equals(Nazwa1, Nazwa2)

Metoda zwraca wartość true(true), jeśli tablice są równej długości i ich elementy są równe. falseZwraca (false) w przeciwnym razie .

Przykłady:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Metoda equalsarray po prostu porównuje referencje dwóch tablic.

false(linki nie są równe)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
Arrays.equals(x1, x2);


true(zawartość tablic jest równa)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3, 4};
Arrays.equals(x1, x2);


false(zawartość tablic jest inna)

5. MetodaArrays.deepEquals()

I jak już się zapewne domyślasz, metoda Arrays.equalsdla tablic dwuwymiarowych nie zadziała poprawnie: z tablicą dwuwymiarową działa tak samo, jak z tablicą jednowymiarową, której elementami są adresy tablic jednowymiarowych.

Dlatego, aby poprawnie porównać tablice wielowymiarowe ( n=1, 2, 3, ...), wymyślili Arrays.deepEquals(). Wezwanie wygląda następująco:

Arrays.deepEquals(Nazwa1, Nazwa2)

Metoda zwraca wartość true (true) , jeśli tablice są równej długości i ich elementy są równe. W przeciwnym razie zwraca false (false) . Jeśli elementy wewnątrz tablicy są również tablicami, do ich porównania używana jest metoda Arrays.deepEquals() i tak dalej.

Przykłady:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
x1.equals(x2);
Metoda equalsarray po prostu porównuje referencje dwóch tablic.

false(linki nie są równe)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.equals(x1, x2);
Metoda Arrays.equalsporówna x1i x2jako jednowymiarowe tablice przechowujące referencje. Linki w nich są przechowywane inaczej.
false(zawartość tablic nie jest równa)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.deepEquals(x1, x2);


true(zawartość tablic jest równa)