
Java programátor expert
Java Vector je jedna z množstva dátových štruktúr (kolekcií) na jednoduchšiu manipuláciu s dátami. rámci nášho seriálu o dátových štruktúrach si predstavíme jednotlivé štruktúry, kolekcie a triedy ukážeme si ich použitie, dostupné metódy, výhody a nevýhody, a poskytneme tipy, kedy je vhodné ich použiť.
V dnešnej časti sa zameriame na kolekciu, ktorá reprezentuje dynamické pole objektov a vie svoju veľkosť podľa potreby aplikácie zväčšiť, resp. zmenšiť – Vector.
Programátori často pracujú so statickými alebo dynamickými poľami. Tieto sú však fixné a môžu uložiť iba dopredu určený počet elementov. Ak sa presiahne kapacita úložného priestoru poľa, najčastejšie musíme vytvoriť pole nové – oveľa väčšie, skopírovať tam prvky zo starého poľa a staré pole zmazať, aby zbytočne nezaberalo miesto v pamäti.
A práve toto z hľadiska programátora odbúrava kolekcia Vektor, ktorá celý proces automatizuje na pozadí. Vector sa flexibilne zväčšuje, keď doň pridáme viac prvkov, než je jeho aktuálna kapacita. V prípade, že dôjde kapacita na ukladanie nových elementov, nová kapacita sa vypočíta ako dvojnásobok starej kapacity (za predpokladu, že si programátor nenastaví vlastný prírastok capacityIncrement).
Zaujímavé na tomto dynamickom zozname je tiež, že môže obsahovať objekty rôznych dátových typov.
Trieda Vector bola predstavená v rámci verzie Javy 1.2 a nachádza sa v balíku java.util. Hoci je v súčasnosti už menej používaná ako podobná kolekcia ArrayList, priamo vo svojej implementácii je Vector synchronizovaný, to znamená, že naraz môže do danej oblasti pristupovať iba jedno vlákno, zatiaľ čo ostatné vlákna musia počkať. Táto vlastnosť ho robí vhodným na využívanie predovšetkým vo viacvláknových aplikáciách.
Pre vytvorenie inštancie Vector môžeme použiť jeden zo štyroch konštruktorov.
1. Vytvorí prázdny vektor s kapacitou 10 (default hodnota)
Vector<E> vector = new Vector<E>();
2. Prázdny vektor s počiatočnou kapacitou size
Vector<E> vector = new Vector<E>(int size);
3. Prázdny vektor s počiatočnou kapacitou size a prírastkom capacityIncrement
Kapacita sa zväčšuje o capacityIncrement, keď je prekročená aktuálna kapacita.
Vector<E> vector = new Vector<E>(int size, int capacityIncrement);
4. Vektor skonštruovaný pomocou kolekcie collection
Inicializuje vektor prvkami z danej kolekcie.
Vector<E> vector = new Vector<E>(Collection<E> collection);
K základným operáciám s kolekciou Vektor patria:
Pridávanie prvkov do vektora môžeme robiť jednotlivo alebo hromadne.
Pridanie jedného prvku
vector.add("Have");
Pridanie viacerých prvkov naraz
vector.addAll(List.of("a", "wonderful", "day"));
Vloženie prvku na daný index
vector.add(1, "all");
Element môžeme aktualizovať pomocou indexu pomocou metódy set(). Tá zároveň vracia pôvodný prvok.
vector.set(3, "year");
vector.set(1, "successful");
Prvky môžeme odstrániť na základe ich indexu alebo podľa hodnoty. Vždy sa vymaže iba jeho prvý výskyt.
Odstránenie podľa hodnoty
vector.remove("a");
Odstránenie prvku podľa jeho indexu
vector.remove(1);
Všetky prvky napravo od odstráneného prvku sa posunú o jednu pozíciu doľava.
Odstránenie všetkých prvkov
vector.removeAll();
Na získanie prvku vektora na konkrétnom indexe zavoláme metódu get().
String firstElement = vector.get(0);
Ak poskytneme metóde get index mimo rozsahu vektora dostaneme výnimku ArrayIndexOutOfBoundsException.
Použitie cyklu for
for (int i = 0; i < vector.size(); i++) {
System.out.println(vector.get(i));
}
Použitie for-each
for (String element : vector) {
System.out.println(element);
}
Ak nás zaujíma, či existuje už prvok vo vektore môžeme použiť volanie contains().
boolean contains = vector.contains("Have");
Rovnako vieme získať index elementu, teda jeho pozíciu vo vektore.
int index = vector.indexOf("year");
Ak metóda vráti hodnotu -1, daný element sa vo vektore nenašiel.
Ak potrebujeme zotriediť vektor, môžeme tak spraviť pomocou metódy sort(), ktorá od nás očakáva na vstupe Comparator objekt. Na tomto mieste je dôležite spomenúť, že triediaci algoritmus nezaručuje stabilnosť, to znamená nezachováva relatívne poradie rovnakých elementov na vstupe.
vector.sort(Comparator.naturalOrder());
Spomeniem ešte niekoľko ďalších užitočných metód.
Kopírovanie do poľa
Object[] array = vector.toArray();
Zmazanie všetkých prvkov
vector.clear();
Určenie kapacity a veľkosť vektora
int capacity = vector.capacity();
int size = vector.size();
Index posledného výskytu daného prvku
vector.lastIndexOf("year");
Kompletný prehľad všetkých prístupných metód pre Vector nájdeš na stránke Oracle.
Dátovú štruktúru Vector môžeme použiť, ak potrebujeme škálovateľnú kolekciu podľa množstva vkladaných elementov, ale nepoznáme presne ich počet. Dá sa využiť aj ako synchronizovaná kolekcia vo viacvláknovej aplikácii, kde viaceré vlákna zapisujú dáta do tej istej štruktúry.
Pre moderné aplikácie odporúčame skúr použiť ArrayList spolu s manuálnou synchronizáciou (napríklad pomocou Collections.synchronizedList), ktorá zabezpečí konzistentnosť a správnosť dát pri paralelnom spracovaní.
Keď už poznáme základné metódy pre kolekciu Vektor, môžeme sa s nimi trochu pohrať v nasledovnom programe, ktorý upravuje dynamicky skupinu reťazcov. Najskôr vytvoríme jednu vetu a potom ju transformuje pomocou metód, ktoré sme sa naučili, na inú.
import java.util.List; import java.util.Vector; public class Main { public static void main(String[] args) { Vector<String> vector = new Vector<>(); vector.add("Have"); vector.addAll(List.of("a", "wonderful", "day")); System.out.println(String.join(" ", vector)); vector.set(0, "Happy"); vector.remove("a"); vector.set(1, "new"); vector.set(2, "year"); vector.add("2025"); System.out.println(String.join(" ", vector)); } }
Výstup z tohto príkladu je:
Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si kód pre Java Vector.