Tablice w Javie to obiekty przechowujące stałą liczbę wartości jednego typu, do których sięgacie po indeksie liczonym od zera. Rozmiar tablicy ustala się przy jej tworzeniu i potem nie da się go zmienić: żeby „dodać element”, tworzycie nową, dłuższą tablicę albo używacie listy ArrayList. To trzynasta lekcja kursu Javy dla testerów. Pokazujemy deklarację, wartości domyślne, Arrays.copyOf, ArrayList i typowe błędy, a każdy przykład skompilowaliśmy i uruchomiliśmy w Javie 25.
Poprzednia wersja tej lekcji twierdziła, że do tablicy wystarczy dodać nowy element. To nieprawda i właśnie od tego miejsca zaczniemy, bo z tym nieporozumieniem przychodzi do nas wielu kursantów. Jeśli nie macie jeszcze środowiska, zacznijcie od lekcji wprowadzenie do języka Java, a typy proste, z których budujemy tablice, omawia lekcja typy danych w Javie.
Spis treści
Czym są tablice w Javie?
Tablica to kontener na wiele wartości tego samego typu pod jedną nazwą. Zamiast pięciu zmiennych kod1 do kod5 macie jedną zmienną kody i sięgacie po element numerem: kody[0] to pierwszy, kody[4] piąty. Według specyfikacji języka Java SE 25, rozdział 10, tablice są w Javie obiektami, a liczbę elementów podaje pole length, pisane bez nawiasów, w odróżnieniu od metody length() w klasie String.

Elementami tablicy mogą być typy proste, jak int czy boolean, albo referencje do obiektów, jak String czy WebElement. Tablica utworzona z podanym rozmiarem, bez wartości, nie jest pusta w sensie „bez niczego”: specyfikacja Javy SE 25 w rozdziale 15.10.2 mówi, że każdy element dostaje wartość domyślną swojego typu.
Źródło: Oracle, The Java Language Specification SE 25, rozdziały 4.12.5 i 15.10.2; wyniki programu TabliceDeklaracja w Javie 25.
Jak zadeklarować i zainicjalizować tablicę w Javie?
Są dwa sposoby. Pierwszy: podajecie rozmiar, a elementy dostają wartości domyślne, które potem nadpisujecie. Drugi: podajecie od razu wartości w klamrach, a rozmiar wynika z ich liczby. Nawiasy kwadratowe piszcie przy typie, String[] srodowiska. Zapis String srodowiska[] też się skompiluje, bo Java odziedziczyła go po języku C, ale w kodzie testów trzymajcie się pierwszego, bo od razu widać, że typem zmiennej jest tablica.
TabliceDeklaracja.java, Java 25
import java.util.Arrays;
public class TabliceDeklaracja {
public static void main(String[] args) {
// Sposób 1: rozmiar podany przy tworzeniu, elementy dostają wartości domyślne
int[] kodyOdpowiedzi = new int[3];
String[] przegladarki = new String[2];
boolean[] wyniki = new boolean[2];
System.out.println(Arrays.toString(kodyOdpowiedzi)); // [0, 0, 0]
System.out.println(Arrays.toString(przegladarki)); // [null, null]
System.out.println(Arrays.toString(wyniki)); // [false, false]
// Sposób 2: inicjalizator, rozmiar wynika z liczby elementów
String[] srodowiska = {"dev", "staging", "preprod"};
// Indeksy liczymy od zera, ostatni element ma indeks length - 1
kodyOdpowiedzi[0] = 200;
kodyOdpowiedzi[2] = 404;
System.out.println(Arrays.toString(kodyOdpowiedzi)); // [200, 0, 404]
System.out.println(srodowiska[0] + ", " + srodowiska[srodowiska.length - 1]);
System.out.println("Liczba środowisk: " + srodowiska.length); // length to pole, bez nawiasów
// Pętla for-each: najprostszy sposób, żeby przejść po wszystkich elementach
for (String env : srodowiska) {
System.out.println("Uruchamiam testy na: " + env);
}
}
}
Wynik uruchomienia
[0, 0, 0]
[null, null]
[false, false]
[200, 0, 404]
dev, preprod
Liczba środowisk: 3
Uruchamiam testy na: dev
Uruchamiam testy na: staging
Uruchamiam testy na: preprod
![Deklaracja i inicjalizacja tablicy w Javie: String[] klienci = new String[100]](https://qualityisland.pl/wp-content/uploads/2026/03/QA-bez-sciemy-13-tablica-4-1024x465.png)
String[] klienci = new String[100] tworzy 100 elementów, każdy na start równy null.Rozmiar podajecie wyrażeniem typu int. Wartości typu byte, short i char też przejdą, bo Java sama zamieni je na int, ale zmienna typu long da błąd kompilacji „possible lossy conversion from long to int”. Rozmiar ujemny skompiluje się, jeśli jest w zmiennej, ale w czasie działania programu skończy się wyjątkiem NegativeArraySizeException. Pętlę for-each, której używamy do przejścia po elementach, szczegółowo omawia lekcja pętle w Javie.
Czy do tablicy w Javie można dodać kolejny element?
Nie. Specyfikacja Javy SE 25, rozdział 10, mówi wprost: gdy obiekt tablicy zostanie utworzony, jego długość nigdy się nie zmienia. Samouczek Oracle dodaje, że długość tablicy ustala się przy tworzeniu i potem jest stała. Próba zapisu pod indeks równy długości tablicy kończy się wyjątkiem ArrayIndexOutOfBoundsException. Macie dwie poprawne drogi: utworzyć nową, dłuższą tablicę i skopiować do niej elementy metodą Arrays.copyOf albo od początku użyć listy ArrayList, która powiększa się sama.
StalyRozmiar.java, Java 25
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class StalyRozmiar {
public static void main(String[] args) {
String[] przegladarki = {"chrome", "firefox"};
// Nie da się dopisać trzeciego elementu: indeks 2 nie istnieje
try {
przegladarki[2] = "edge";
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Błąd: " + e.getMessage());
}
// Arrays.copyOf tworzy NOWĄ, dłuższą tablicę i kopiuje do niej elementy
String[] wiecej = Arrays.copyOf(przegladarki, przegladarki.length + 1);
wiecej[wiecej.length - 1] = "edge";
System.out.println(Arrays.toString(przegladarki)); // [chrome, firefox], stara bez zmian
System.out.println(Arrays.toString(wiecej)); // [chrome, firefox, edge]
// ArrayList sama zarządza rozmiarem: add dopisuje, remove usuwa
List<String> lista = new ArrayList<>(List.of("chrome", "firefox"));
lista.add("edge");
lista.remove("firefox");
System.out.println(lista + ", rozmiar: " + lista.size()); // [chrome, edge], rozmiar: 2
// Pułapka: Arrays.asList zwraca listę o stałym rozmiarze, opartą na tablicy
List<String> zTablicy = Arrays.asList(przegladarki);
try {
zTablicy.add("safari");
} catch (UnsupportedOperationException e) {
System.out.println("Arrays.asList nie przyjmie nowego elementu: UnsupportedOperationException");
}
}
}
Wynik uruchomienia
Błąd: Index 2 out of bounds for length 2
[chrome, firefox]
[chrome, firefox, edge]
[chrome, edge], rozmiar: 2
Arrays.asList nie przyjmie nowego elementu: UnsupportedOperationException
Zwróćcie uwagę na drugą linię wyniku: Arrays.copyOf nie zmieniło starej tablicy. Według dokumentacji Java SE 25 metoda kopiuje tablicę, ucinając ją albo dopełniając wartościami domyślnymi do nowej długości, i zwraca nowy obiekt. Jeśli chcecie dalej pracować na dłuższej wersji, przypiszcie wynik do zmiennej, na przykład przegladarki = Arrays.copyOf(przegladarki, 3);.
Lista, która udaje, że jest listą
Metoda Arrays.asList zwraca obiekt typu List, więc wygląda jak zwykła lista. Dokumentacja Java SE 25 opisuje ją jednak jako listę o stałym rozmiarze, opartą na podanej tablicy. Możecie podmieniać jej elementy, ale add i remove rzucą UnsupportedOperationException, co widać w ostatniej linii wyniku. Podobnie zachowuje się List.of, które w ogóle nie pozwala na zmiany. Dlatego w przykładzie piszemy new ArrayList<>(List.of(...)): dopiero kopia w ArrayList daje listę, do której można dopisywać.
A jak ArrayList radzi sobie z rozmiarem, skoro sama w środku trzyma tablicę? Robi dokładnie to, co my ręcznie: gdy miejsce się kończy, tworzy większą tablicę i kopiuje elementy. W kodzie źródłowym OpenJDK 25 domyślna pojemność to 10 elementów, a przy powiększaniu nowa tablica jest zwykle o połowę większa od poprzedniej. To szczegół implementacji, nie gwarancja specyfikacji, ale dobrze tłumaczy, dlaczego dopisywanie do listy jest wygodne i zwykle szybkie.
Kiedy wybrać tablicę, a kiedy ArrayList?
W codziennym kodzie testów częściej sięgniecie po listę, bo dane testowe rzadko mają z góry znaną liczbę. Tablica ma jednak swoje miejsce: parametr main(String[] args), metody ze zmienną liczbą argumentów, które wewnątrz są tablicą, i dane o stałym rozmiarze, jak zestaw przeglądarek w konfiguracji.
Źródło: Oracle, dokumentacja Java SE 25: klasy Arrays, ArrayList i List; JLS SE 25, rozdział 10.
W Selenium spotkacie listy na każdym kroku, bo driver.findElements(...) zwraca List<WebElement>, a nie tablicę. Przykład znajdziecie w lekcji selektory proste w Selenium.
Jakie błędy przy tablicach popełniają początkujący?
Z naszego doświadczenia ze szkoleń z podstaw Javy cztery błędy przy tablicach wracają w każdej grupie. Każdy da się wychwycić w kilka sekund, jeśli wiecie, czego szukać.
Wypisz.java, Java 25
import java.util.Arrays;
public class Wypisz {
public static void main(String[] args) {
int[] kody = {200, 404};
System.out.println(kody); // np. [I@2b2fa4f7: typ i skrót hashCode zamiast zawartości
System.out.println(Arrays.toString(kody)); // [200, 404]
}
}
Źródło: Oracle, JLS SE 25, rozdziały 10.4 i 15.10; programy z tej lekcji uruchomione w Javie 25.
Tablica w Javie jest jak sala szkoleniowa z ponumerowanymi krzesłami: można przesadzać ludzi, ale dostawienie trzynastego krzesła do sali na dwanaście wymaga innej sali. Tak samo z indeksami: liczymy od zera, więc w sali na 12 miejsc ostatnie krzesło ma numer 11.
Jak używać tablic w testach automatycznych?
W testach tablice najczęściej trzymają dane do przypadków testowych. Tablica dwuwymiarowa, czyli tablica tablic, to prosta tabela: każdy wiersz to jeden przypadek, każda kolumna jedna dana wejściowa albo oczekiwany wynik. Taką tabelę przekażecie później do testów parametryzowanych, a metoda przyjmująca tablicę pozwala policzyć wyniki bez powtarzania pętli w każdym teście.
DaneTestowe.java, Java 25
import java.util.Arrays;
public class DaneTestowe {
// Metoda przyjmuje tablicę i zwraca liczbę niepoprawnych kodów
static int policzBledy(int[] kody) {
int bledy = 0;
for (int kod : kody) {
if (kod >= 400) {
bledy++;
}
}
return bledy;
}
public static void main(String[] args) {
// Tablica dwuwymiarowa: każdy wiersz to zestaw danych do jednego przypadku testowego
String[][] logowania = {
{"anna@example.com", "Haslo123!", "Zalogowano"},
{"anna@example.com", "zle", "Nieprawidłowe hasło"},
{"", "Haslo123!", "Podaj login"}
};
for (String[] przypadek : logowania) {
System.out.println("login=" + przypadek[0] + " hasło=" + przypadek[1] + " oczekiwane=" + przypadek[2]);
}
System.out.println("Przypadków: " + logowania.length + ", kolumn: " + logowania[0].length);
int[] kody = {200, 201, 404, 500, 302};
System.out.println("Błędnych odpowiedzi: " + policzBledy(kody));
// Porównanie tablic: == porównuje referencje, Arrays.equals zawartość
int[] oczekiwane = {200, 201};
int[] otrzymane = {200, 201};
System.out.println((oczekiwane == otrzymane) + " " + Arrays.equals(oczekiwane, otrzymane)); // false true
// Sortowanie i wypisanie bez pętli
Arrays.sort(kody);
System.out.println(Arrays.toString(kody)); // [200, 201, 302, 404, 500]
}
}
Wynik uruchomienia
login=anna@example.com hasło=Haslo123! oczekiwane=Zalogowano
login=anna@example.com hasło=zle oczekiwane=Nieprawidłowe hasło
login= hasło=Haslo123! oczekiwane=Podaj login
Przypadków: 3, kolumn: 3
Błędnych odpowiedzi: 2
false true
[200, 201, 302, 404, 500]
Tablice w liczbach
0
indeks pierwszego elementu; ostatni ma indeks length minus 1, według JLS SE 25, rozdział 10.4
10
domyślna pojemność ArrayList w kodzie źródłowym OpenJDK 25
1,5x
typowy przyrost pojemności ArrayList przy powiększaniu w OpenJDK 25
2025
rok wydania Javy 25 z długim wsparciem, według OpenJDK
Źródło: Oracle, JLS SE 25, rozdział 10; OpenJDK jdk25u, ArrayList.java; OpenJDK, JDK 25.
Elementy tablicy często przetwarza się w pętli razem z instrukcją wyboru, na przykład gdy każdy element to nazwa środowiska albo przeglądarki. Nowoczesną składnię ze strzałką i switch expression z Javy 14 oraz 21 opisujemy w lekcji instrukcja switch w Javie. Jak wynieść powtarzaną pętlę do osobnej metody, jak policzBledy wyżej, pokazuje lekcja metody w Javie.
Zadania z tablic i list to stały punkt rozmów rekrutacyjnych na juniora w automatyzacji testów. Jeśli szukacie pracy w QA, na QA Board możecie pokazać firmom, co już umiecie. A jeśli chcecie przerobić tablice, kolekcje i pętle z trenerem, służy do tego szkolenie wprowadzenie do programowania od podstaw w Javie, dla osób piszących już proste programy programowanie w Javie dla testerów oprogramowania, a jako kolejny krok automatyzacja testów z Selenium WebDriver. W Quality Island przeszkoliliśmy już ponad 2 500 specjalistów, a zespół napisał ponad 450 000 testów automatycznych, w których listy danych testowych pojawiają się częściej niż jakakolwiek inna struktura.
Co zabrać z tego artykułu
01Tablica w Javie ma stały rozmiar. Po utworzeniu jej długość nigdy się nie zmienia, więc „dodanie elementu” to nowa tablica albo ArrayList.
02Arrays.copyOf zwraca nową, dłuższą tablicę i nie zmienia starej. Wynik przypiszcie do zmiennej.
03ArrayList rośnie sama: add dopisuje, remove usuwa, size podaje liczbę elementów. Arrays.asList i List.of nie przyjmą nowych elementów.
04Indeksy liczymy od zera, ostatni to length minus 1. Tablice wypisujcie przez Arrays.toString, porównujcie przez Arrays.equals.
05W testach tablica dwuwymiarowa to prosta tabela przypadków testowych, a findElements w Selenium zwraca listę, nie tablicę.
Źródło: Oracle, JLS SE 25, rozdział 10; dokumentacja Java SE 25 (Arrays, ArrayList, List); kod skompilowany w Javie 25.
Chcecie, żeby Wasi testerzy swobodnie pracowali na tablicach, listach i danych testowych w Javie? Na szkoleniu przerobicie to na przykładach z automatyzacji, z trenerem praktykiem.
Powiązane na blogu Quality Island
- Pętle w Javie: for, while, do while i for-each z przykładami dla testerów
- 11. Instrukcja switch w Javie: klasyczna składnia, strzałka i switch expression
- 16. Metody w Javie
- 14. Programowanie obiektowe: klasy i obiekty
- Java dla testerów automatyzujących: jak zacząć naukę
Pełna lista źródeł
- Oracle, The Java Language Specification, Java SE 25 Edition, rozdział 10 Arrays, 2025. Stała długość tablicy, wartości domyślne, indeksowanie typem int, ArrayIndexOutOfBoundsException.
- Oracle, The Java Tutorials: Arrays, 2024. Długość ustalana przy tworzeniu i potem stała.
- Oracle, Java SE 25 API: klasa Arrays, 2025. copyOf, asList (lista o stałym rozmiarze), toString, equals, sort.
- Oracle, Java SE 25 API: klasa ArrayList i interfejs List, 2025.
- OpenJDK, kod źródłowy ArrayList.java w jdk25u, 2026. DEFAULT_CAPACITY = 10 i przyrost o połowę.
- OpenJDK, JDK 25, strona projektu, 2025.
- Quality Island, dane własne 2026: ponad 2 500 przeszkolonych specjalistów i ponad 450 000 testów automatycznych; kod lekcji skompilowany javac 25 z opcją
--release 25-Xlint:all 11.10.2026.
Autor lekcji: Tomasz Stelmach.



