1. Wprowadzenie
Tablice w Javie — potężne narzędzie, ale podstawowa składnia szybko zamienia się w rutynę. Z pomocą przychodzi klasa java.util.Arrays — zestaw metod statycznych do pracy z tablicami: sortowanie, kopiowanie, porównywanie, formatowane wypisywanie i nie tylko. Nie trzeba tworzyć instancji — wszystkie metody są statyczne i wywołuje się je przez nazwę klasy.
Aby używać metod, dodaj import na początku pliku:
import java.util.Arrays;
Jeśli zapomnisz o imporcie, kompilator zgłosi, że Arrays „nie znaleziono” — to nie bug, lecz oczekiwane zachowanie bez importu.
2. Sortowanie tablicy: Arrays.sort
Jak działa Arrays.sort
Składnia
Arrays.sort(array);
Arrays.sort(array, startIndex, endIndex);
Metoda sortuje „w miejscu” — zmienia tablicę źródłową i nie zwraca nowej. Chcesz zachować oryginalną kolejność? Najpierw skopiuj tablicę.
Przykład: sortowanie tablicy liczb całkowitych
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // Sortujemy rosnąco
System.out.println("Posortowana tablica: " + Arrays.toString(scores));
// Wyświetli: [1, 2, 5, 7, 9]
Przykład: sortowanie tablicy łańcuchów
String[] names = {"Vasya", "Petya", "Anya", "Igor"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Anya, Igor, Petya, Vasya]
Ważne: łańcuchy sortowane są leksykograficznie (alfabetycznie), liczby — rosnąco.
Sortowanie części tablicy
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // sortuje elementy o indeksach 1..3 (4 jest wyłączone)
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
Uwagi
- Sortowanie „w miejscu”: zmienia się tablica źródłowa.
- Liczby — rosnąco, łańcuchy — alfabetycznie.
- Dla złożonych obiektów użyj przeciążeń z komparatorem.
3. Wypełnianie tablicy: Arrays.fill
Składnia
Arrays.fill(array, value);
Arrays.fill(array, startIndex, endIndex, value);
Metoda wypełnia wszystkie elementy lub wskazaną część tablicy tą samą wartością.
int[] marks = new int[5];
Arrays.fill(marks, 3); // Wszystkie elementy teraz równe 3
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
Wypełnianie części tablicy
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // wypełni elementy o indeksach 2..4 (5 jest wyłączone)
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
Wypełnianie tablicy łańcuchów
String[] guests = new String[4];
Arrays.fill(guests, "Pusto");
System.out.println(Arrays.toString(guests)); // [Pusto, Pusto, Pusto, Pusto]
4. Kopiowanie tablicy: Arrays.copyOf i Arrays.copyOfRange
Arrays.copyOf
Składnia
Arrays.copyOf(originalArray, newLength);
Tworzy nową tablicę i kopiuje elementy z tablicy źródłowej. Jeśli nowa długość jest większa od źródłowej, „ogon” zostanie wypełniony wartościami domyślnymi (0 dla int, null dla referencji).
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
Skracanie tablicy
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
Składnia
Arrays.copyOfRange(originalArray, startIndex, endIndex);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // Skopiuje elementy o indeksach 1..3
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. Porównywanie tablic: Arrays.equals i Arrays.deepEquals
W Javie nie można porównywać tablic przez == — tak porównuje się referencje, a nie zawartość:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
Jak porównywać zawartość?
Arrays.equals(array1, array2);
Arrays.deepEquals(matrix1, matrix2);
System.out.println(Arrays.equals(a, b)); // true
Dla tablic jednowymiarowych używaj Arrays.equals, dla dwuwymiarowych i głębszych — Arrays.deepEquals.
Przykład: porównanie tablic dwuwymiarowych
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. Ładne wypisywanie tablicy: Arrays.toString i Arrays.deepToString
Bezpośrednie wypisanie tablicy da nieczytelny ciąg:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
Składnia
Arrays.toString(array);
Arrays.deepToString(matrix);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. Typowe błędy podczas pracy z klasą Arrays
Błąd nr 1: próba porównania tablic przez ==
Tablice to obiekty, a == porównuje jedynie referencje. Nawet przy identycznych wartościach wynik będzie false. Używaj Arrays.equals (dla jednowymiarowych) lub Arrays.deepEquals (dla wielowymiarowych).
Błąd nr 2: zapomnienie, że sortowanie zmienia tablicę „w miejscu”
Jeśli potrzebujesz oryginalnej kolejności, najpierw zrób kopię metodą Arrays.copyOf, a dopiero potem sortuj kopię. W przeciwnym razie oryginał straci swój porządek.
Błąd nr 3: błędne rozumienie granic w Arrays.fill i Arrays.copyOfRange
Metody używają półotwartego zakresu: prawy indeks jest wyłączony. Na przykład, Arrays.fill(arr, 2, 5, 9) wypełni indeksy 2, 3, 4, a element o indeksie 5 pozostawi bez zmian.
Błąd nr 4: próba bezpośredniego wypisania tablicy
Wywołanie System.out.println(arr) drukuje techniczną reprezentację. Używaj Arrays.toString dla tablic jednowymiarowych i Arrays.deepToString dla wielowymiarowych.
Błąd nr 5: porównywanie tablic wielowymiarowych przez Arrays.equals
Metoda porównuje tylko najwyższy poziom (referencje do wewnętrznych tablic). Do porównania zawartości użyj Arrays.deepEquals.
GO TO FULL VERSION