Java Vector: Dátová štruktúra a trieda Vector (dynamické pole) v Jave

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.

Hierarchia dedičnosti pre kolekciu Vector
Hierarchia dedičnosti pre kolekciu Vector

Java Vector: Predstavenie dátovej štruktúry „dynamické pole objektov“ v Jave

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.

Java Vector  – konštruktory

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);

Java Vector  – základné operácie

K základným operáciám s kolekciou Vektor patria:

  • pridávanie prvkov (po jednom, hromadne),
  • aktualizovanie resp. nahradenie prvkov,
  • odstraňovanie prvkov (podľa indexu alebo hodnoty),
  • prístup ku elementu,
  • prechádzanie kolekcie pomocou for alebo for-each,
  • hľadanie prvku,
  • zotriedenie prvkov.

Pridávanie elementov

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");

Aktualizácia resp. nahradenie elementov

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");

Odstraňovanie elementov

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();

Prístup k prvku

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.

Prechádzanie (iterácia) cez vektor

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);
}

Hľadanie prvku

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.

Zotriedenie vektora

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());

Ďalšie operácie pre dynamické pole objektov (Vector)

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");

Dokumentácia

Kompletný prehľad všetkých prístupných metód pre Vector nájdeš na stránke Oracle.

Java Vector výhody

  • Dynamický rozsah sa postará o uloženie toľkých prvkov, koľko ich bude treba.
  • Synchronizácia vektora umožňuje použitie vo viacvláknovom prostredí.
  • Podpora pre staršie Java aplikácie, ktoré ešte fungujú na starších API.
  • Umožňuje pridávanie null elementov.

Java Vector nevýhody

  • Slabší výkon v porovnaní s inými triedami kolekcie ako je napr. ArrayList kvôli synchronizácii.
  • Prežitok v moderných aplikáciách.

Kedy využiť Java Vector

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

Príklad použitia dynamického poľa objektov Vector v Java programe

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:

Výstup z príkladu Main.java Vector

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.

O autorovi

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Daj nám o sebe vedieť