PrzedsprzedażAkademia AI w testach i jakości oprogramowania: 1 350 zł zamiast 1 750 zł netto do 30 listopada

Startuje przedsprzedaż Akademii AI w testach i jakości oprogramowania: 5 tygodni z Tomaszem Stelmachem, start 11 stycznia 2027. Wyjątkowa cena 1 350 zł netto zamiast 1 750 zł tylko do 30 listopada.

zostało 25 dniZobaczcie program i zapiszcie się
13. Tablice w Javie: stały rozmiar, Arrays.copyOf i ArrayList
Czas czytania: 12 minut

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.

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.

Tablice w Javie: tablica to podstawowa struktura danych przechowująca wiele elementów
Tablica to podstawowa struktura danych do przechowywania wielu elementów jednego typu.

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.

Typ elementów Wartość domyślna Przykład
int, long, short, byte 0 new int[3] daje [0, 0, 0]
double, float 0.0 new double[2] daje [0.0, 0.0]
boolean false new boolean[2] daje [false, false]
char znak o kodzie 0 niewidoczny przy wypisaniu
typy referencyjne, np. String null new String[2] daje [null, null]

Ź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]
Kadr z filmu: deklaracja 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.

Cecha Tablica ArrayList
Rozmiar stały od utworzenia rośnie i maleje sam
Dodanie elementu nowa tablica przez Arrays.copyOf add()
Liczba elementów pole length metoda size()
Typy proste tak, np. int[] tylko obiekty, np. List<Integer>
Wypisanie zawartości Arrays.toString(t) zwykłe println(lista)
Porównanie zawartości Arrays.equals(a, b) a.equals(b)
Typowe użycie w testach stałe zestawy danych, varargs, args wyniki z findElements, dane z plików, dynamiczne zbiory

Ź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]
    }
}
Błąd Objaw Poprawnie
indeks równy length ArrayIndexOutOfBoundsException, np. Index 2 out of bounds for length 2 ostatni element to t[t.length - 1]
wypisanie tablicy przez println tekst w rodzaju [I@2b2fa4f7 zamiast wartości Arrays.toString(t)
porównanie tablic przez == false dla tablic o tej samej zawartości Arrays.equals(a, b)
rozmiar typu long albo ujemny błąd kompilacji albo NegativeArraySizeException rozmiar typu int, sprawdzony przed utworzeniem

Ź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.

Zobacz szkolenie z Javy

Poprzednia lekcja12. Łańcuchy znakoweSpis kursuWszystkie lekcje kursu JavyNastępna lekcja14. Programowanie obiektowe: klasy i obiekty

Powiązane na blogu Quality Island

Pełna lista źródeł

Autor lekcji: Tomasz Stelmach.

Co o tym sądzisz?

Dodaj komentarz

Bądź na bieżąco
Strefa QA, portal z eksperckimi artykułami o jakości oprogramowania
Bądź na bieżąco
Specjalista ds. AI w organizacji
Specjalista ds. AI w organizacji: program przekwalifikowujący

4 400,00 zł

03.02.27, 14.04.27, 02.06.27
5 dni
Inżynier AI
Inżynier AI: program przekwalifikowujący dla specjalistów IT

6 900,00 zł

12.01.27, 16.03.27
8 tygodni
KURS ONLINE: PAQT Foundation, AI w pracy testera, przygotowanie do egzaminu

590,00 zł

Popularne artykuły
Język Gherkin: co to jest i jak go używać w testowaniu oprogramowania
Smoke test: co to jest, kiedy go uruchamiać i czym różni się od sanity testu
Jak zostać testerem oprogramowania: ścieżka krok po kroku bez dyplomu informatyka
Najnowsze artykuły
Tester manualny: co robi, ile zarabia w 2026 i checklista kompetencji na rozmowę
Art. 4 AI Act po Digital Omnibus: kompetencje w zakresie AI w zespole IT i QA, checklista i rejestr szkoleń
NIS2 i KSC dla zarządu: obowiązki kierownika, kara do 300% wynagrodzenia i protokół nadzoru
Popularne kategorie

Grupa marek jakości oprogramowania

Jakość oprogramowania w Polsce ma swój adres

Quality Island