KODO STRUKTŪRA

Java duomenų kolekcijos

Java Collections Framework – tai sąsajų, klasių ir bendrų metodų rinkinys, padedantis saugoti, rasti, grupuoti ir tvarkyti kelis objektus.

Kam reikalingos kolekcijos?

Masyvo dydis nustatomas jį kuriant. Kolekcija gali augti ar mažėti programai veikiant ir pateikia paruoštus metodus elementams pridėti, šalinti, ieškoti ar pereiti.

Masyvo ir kolekcijos palyginimas
SavybėMasyvasKolekcija
DydisNustatomas sukūrimo metuDažniausiai gali keistis
ElementaiGali saugoti ir primityviuosius tipusSaugo objektus; primityvams naudojamos wrapper klasės
VeiksmaiPagrindiniai veiksmai atliekami rankiniu kodu arba per ArraysTuri metodus, pvz., add(), remove(), contains()

Pavyzdžiui, List<Integer> saugo Integer objektus. Java automatiškai gali paversti int į Integer; tai vadinama autoboxing.

Sąsajos ir jas įgyvendinančios klasės

Sąsaja nusako, kokius veiksmus kolekcija turi mokėti atlikti. Konkreti klasė pasirenka, kaip tuos veiksmus įgyvendinti.

Pagrindinės Collections Framework sąsajos
SąsajaDažnos klasėsPaskirtis
ListArrayList, LinkedListIšlaiko eilės tvarką, leidžia pasikartojimus ir prieigą pagal indeksą.
SetHashSet, LinkedHashSet, TreeSetSaugo tik unikalius elementus.
Queue / DequeArrayDeque, LinkedListTvarko elementus pagal apdorojimo eilę arba leidžia veiksmus abiejuose galuose.
MapHashMap, LinkedHashMap, TreeMapSaugo rakto ir reikšmės poras; kiekvienas raktas unikalus.
Map nėra Collection sąsajos vaikas.

Map priklauso Collections Framework, tačiau sudaro atskirą rakto ir reikšmės porų hierarchiją. List, Set ir Queue priklauso Collection hierarchijai.

List – tvarkingas sąrašas

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

List<String> pirkiniai = new ArrayList<>();
pirkiniai.add("duona");
pirkiniai.add("pienas");
pirkiniai.add("duona");

System.out.println(pirkiniai);
System.out.println(pirkiniai.get(1));
Konsolės rezultatas

[duona, pienas, duona]
pienas

  1. Kintamojo tipas yra sąsaja List<String>, o objektas sukuriamas su ArrayList.
  2. <String> nurodo, kad sąraše galima saugoti tik tekstus.
  3. List leidžia dvi vienodas duona reikšmes.
  4. get(1) paima antrą elementą, nes indeksai prasideda nuo nulio.

Set – unikalios reikšmės

import java.util.HashSet;
import java.util.Set;

Set<String> miestai = new HashSet<>();
miestai.add("Vilnius");
miestai.add("Kaunas");
miestai.add("Vilnius");

System.out.println(miestai.size());
System.out.println(miestai.contains("Kaunas"));
Konsolės rezultatas

2
true

Vilnius pridedamas du kartus, tačiau Set jo nedubliuoja. HashSet negarantuoja elementų išvedimo tvarkos, todėl pavyzdyje tikrinamas dydis ir konkretaus miesto buvimas.

Map – raktai ir reikšmės

import java.util.HashMap;
import java.util.Map;

Map<String, Integer> pazymiai = new HashMap<>();
pazymiai.put("Ieva", 9);
pazymiai.put("Mantas", 8);
pazymiai.put("Ieva", 10);

System.out.println(pazymiai.get("Ieva"));
System.out.println(pazymiai.size());
Konsolės rezultatas

10
2

  1. Map<String, Integer> naudoja vardą kaip raktą ir pažymį kaip reikšmę.
  2. put("Ieva", 9) įrašo pirmą pažymį.
  3. Tam pačiam raktui vėliau priskyrus 10, ankstesnė reikšmė pakeičiama.
  4. Žemėlapyje lieka du unikalūs raktai.

Kolekcijos elementų perėjimas

List<String> vardai = List.of("Rūta", "Jonas", "Aistė");

for (String vardas : vardai) {
    System.out.println(vardas);
}
Konsolės rezultatas

Rūta
Jonas
Aistė

for-each ciklas po vieną paima kiekvieną kolekcijos elementą. Sudėtingesniais atvejais galima naudoti Iterator, forEach() arba Stream API.

Kaip pasirinkti kolekciją?

  • Rinkis List, kai svarbi eilės tvarka, indeksai arba leidžiami pasikartojimai.
  • Rinkis Set, kai kiekviena reikšmė turi būti unikali.
  • Rinkis Map, kai reikšmę reikia rasti pagal unikalų raktą.
  • Rinkis Queue, kai elementai turi būti apdorojami nustatyta eile.

Pradžioje dažniausiai pakanka ArrayList, HashSet, HashMap ir ArrayDeque.

Dažni metodai

Kolekcijų metodų paskirtis
MetodasPaskirtis
add()Prideda elementą į Collection.
remove()Pašalina elementą.
contains()Patikrina, ar elementas yra kolekcijoje.
size()Grąžina elementų skaičių.
isEmpty()Patikrina, ar kolekcija tuščia.
clear()Pašalina visus elementus.
put() / get()Įrašo arba gauna Map reikšmę pagal raktą.