List.subList în Java

Returnează o vedere a unei porțiuni din listă, de la fromIndex inclusiv la toIndex exclusiv.

Sintaxă
List<E> subList(int fromIndex, int toIndex)

Ce face List.subList

subList(de, pana) dă elementele de la poziția de (inclusă) până la pana (exclusă). Lungimea porțiunii este pana - de. Rezultatul nu este o copie, ci o vedere: modificările făcute prin ea (set, clear, add) se văd în lista originală.

Un truc util: lista.subList(2, 5).clear() șterge pozițiile 2, 3 și 4 din listă. Dacă însă modifici structura listei originale (adaugi sau ștergi elemente direct în ea), vederea devine invalidă și orice folosire a ei aruncă ConcurrentModificationException.

Parametri

Parametru Descriere
fromIndex Poziția de început, inclusă.
toIndex Poziția de sfârșit, exclusă. Trebuie 0 ≤ fromIndex ≤ toIndex ≤ size().

Ce returnează

O listă-vedere peste porțiunea cerută.

Exemple

Exemplul 1: Primele trei din clasament

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> clasament = List.of("Ana", "Mihai", "Ioana", "Radu", "Elena", "Dan");
        System.out.println("Podium: " + clasament.subList(0, 3));
        System.out.println("Restul: " + clasament.subList(3, clasament.size()));
        System.out.println("Gol: " + clasament.subList(2, 2));
    }
}

Rezultat

Podium: [Ana, Mihai, Ioana]
Restul: [Radu, Elena, Dan]
Gol: []

Exemplul 2: Ștergerea unei porțiuni prin vedere

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numere = new ArrayList<>(List.of(0, 1, 2, 3, 4, 5, 6));
        numere.subList(2, 5).clear();
        System.out.println("După ștergere: " + numere);

        List<Integer> parte = numere.subList(0, 2);
        parte.set(0, 100);
        System.out.println("Originalul vede schimbarea: " + numere);
    }
}

Rezultat

După ștergere: [0, 1, 5, 6]
Originalul vede schimbarea: [100, 1, 5, 6]

Exemplul 3: Pagini de câte 3 rezultate

Math.min evită un toIndex mai mare decât lungimea listei pe ultima pagină.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> produse = List.of("pix", "caiet", "riglă", "radieră", "creion", "carioci", "acuarele");
        int peste = 3;
        for (int start = 0; start < produse.size(); start += peste) {
            int sfarsit = Math.min(start + peste, produse.size());
            System.out.println("Pagina " + (start / peste + 1) + ": " + produse.subList(start, sfarsit));
        }
    }
}

Rezultat

Pagina 1: [pix, caiet, riglă]
Pagina 2: [radieră, creion, carioci]
Pagina 3: [acuarele]

Greșeli frecvente

  • Crezi că toIndex este inclus: subList(0, 3) are 3 elemente (pozițiile 0, 1, 2).
  • Păstrezi o subList și apoi adaugi elemente în lista originală. La următoarea folosire a vederii apare ConcurrentModificationException; dacă ai nevoie de porțiune pe termen lung, copiaz-o: new ArrayList<>(l.subList(a, b)).

Comenzi înrudite

  • List.get: get citește elementul de la o poziție; set îl înlocuiește și returnează valoarea veche.
  • List.reversed: Returnează o vedere a listei în ordine inversă; nu copiază elementele și urmărește modificările listei originale.
  • Arrays.copyOf: copyOf face un array nou cu primele n elemente (completând cu 0/null dacă e mai lung); copyOfRange copiază o porțiune.
  • List.remove: Șterge elementul de la o poziție sau prima apariție a unei valori; elementele de după se mută la stânga.