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ă
toIndexeste 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 apareConcurrentModificationException; 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.