Gyakorlati alapok III.
A Collection interfész
Az előző fejezetben iteráló komponensekkel ismerkedtünk meg, amelyek interfész formájában előzik meg a Collection interfészt.
A kérdés, hogy jogos-e ez a megközelítés a Java alkotói részéről, azaz az iterálás általánosabb tevékenység-e a kollekciónál (hiszen láttuk az interfész-hierarchiában, hogy az előbbi megelőzi az utóbbit)?
A válasz természetesen igen, hiszen az iterálás bármely -nemcsak
kollekció-jellegű-, objektumon is elvégezhető, tehát ez mindenképpen
általánosabb bármely kollekció építésénél és menedzselésénél.
Ebben a fejezetben a Collection interfésszel folytatjuk, amelyik 2. a
hierarchiában...
Forrás - Source: www.myshared.ru
...valamint az öröklődésből következően már fog tartalmazni egy Iterator
objektumot is az ős Iterable interfésztől. A Java-rendszer nem tartalmaz
konkrét implementációt ezen interfészre, mert túl általános megközelítéseket
tartalmaz, helyette a belőle továbbszármaztatott, egyre specifikusabb
interfészek kerültek kidolgozásra. A Collection interfész objektumok
csoportját zárja egységes adatszerkezetbe, ezen objektumokat elemeknek hívjuk.
Érdemes mindenekelőtt a Collection interfész szabványos kódját áttanulmányoznunk:
public interface Collection<E>
extends Iterable<E>
package java.util;
public interface Collection<E> extends Iterable<E>
boolean add(E o);
boolean addAll(Collection<? extends E> c);
void clear();
boolean contains(Object o);
boolean containsAll(Collection<?> c);
boolean equals(Object o);
int hashCode();
boolean isEmpty();
Iterator<E> iterator();
boolean remove(Object o);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
int size();
Object[] toArray();
<T> T[] toArray(T[] a);
}
A Java alkotói tehát úgy vélték, hogy a fenti adatok és metódusok a legmegfelelőbb kiindulópontok egy kollekció megalkotásához és menedzseléséhez. A teljesség igénye nélkül nézzük meg legfontosabb tulajdonságait:
-
a legáltalánosabb megfogalmazásból logikusan következik, hogy a Collection interfész általános (generikus) típussal rendelkezik,
-
int size() - a kollekció elemszáma - érdekes, de programozástechnikailag a leglogikusabb megközelítés, hogy a size() metódus (kollekcióméret) nem mást, mint az elemek számát adja vissza,
-
boolean isEmpty() - a kollekció ürességének vizsgálata,
-
boolean equals() – egyenlőségvizsgálat (ehhez néha további finomítások is szükségesek),
-
void clear() - a kollekció összes elemének törlése,
-
boolean contains() – elemtartalmazási vizsgálat,
-
boolean add() és remove() – elemhozzáadás és elemeltávolítás. Speciális típusa van ezen metódusoknak: boolean. Oka a többféle kollekcióban keresendő, ugyanis némelyik kollekciótípus megengedi a duplikált vagy éppen többszörös elemtartalmat, némelyik pedig nem. Ezen adattípus tehát flag-szerűen azt jelzi, hogy történt-e a kollekcióban elemváltozás.
-
Iterator() - az Iterable interfész által szolgáltatott iteráló objektum.
További, érdekes metódusok, amelyek nem 1 elemen, hanem egész kollekciókon hajtanak végre műveleteket (bulk operations):
-
boolean addAll - halmazelméletben unióképzés – a 2 kollekció egyesítése (hasonlóan a 2 tömb uniója című fejezethez),
-
boolean removeAll - halmazelméletben különbségképzés – a célkollekció minden olyan elemének eltávolítása, amelyet a bemeneti kollekció tartalmazott (hasonlóan a 2 tömb különbsége című fejezethez),
-
boolean containsAll – halmazelméletben részhalmazképzés – a célkollekció tartalmaz minden olyan elemet, amelyet a bemeneti kollekció tartalmazott.
-
boolean retainAll – halmazelméletben metszet, azaz közös rész képzése – a célkollekció és bemeneti kollekció közös elemeit fogja tartalmazni (hasonlóan a 2 tömb metszete című fejezethez).
Az interfész ismertetésekor észrevehettünk tömbműveleteket is:
Object[] toArray();
<T> T[] toArray(T[] a);
Ezen metódusok voltaképpen "kódhidak", összeköttetések visszafelé, a régebbi Java-rutinok felé,
tehát a Java-alkotói a korlátozottan bár, de gondoltak a “lefelé történő”
kompatibilitásra is, illetve néha kifejezetten hasznos lehet a kollekciókat
vizsgálat, teszt, egyéb okokból tömbformátumban is “exportálni”.
Most pedig nézzük meg, hogy a Collection interfész specializálásával milyen
jellegű kollekciók keletkeznek!
Set (halmaz)
A Set fő jellegzetessége, hogy nem tartalmazhat duplikált-többszörös elemeket,
ennek vizsgálatához az öröklött equals() és
hashCode() metódusokat használja
fel. 2 db Set akkor egyenlő, ha ugyanazon elemeket tartalmazzák.
Valós életből
vett példák: bármilyen általánosabb megközelítésű katalógus, például állat-,
és növényfajok, autómárkák, országnevek, megyenevek, fegyvernemek, stb.
adatbázisa.
List (lista)
A List tartalmazhat többszörös elemeket, az elemek tárolása pedig
szalagszerűn, szekvenciálisan történik és mivel az elempozíciók indexelve
vannak, bármelyik listaelem kiválasztható, módosítható.
Valós életből vett
példák: pizzafutár rendelési címei, GPS-útvonalterv (vegyük észre, hogy ez sok
esetben, mint fordított listabejárás visszafelé is működhet!).
Map (leképezés)
Legfőbb jellegzetessége, hogy kulcs-érték párokat tartalmaz. 1 kulcs csak 1
értéket azonosíthat be, illetve tiltott a többszörös kulcshasználat.
Valós életből vett példák: személyi szám és személynév adatbázisa, ahol kikötés, hogy 1 személyhez csak 1 személyi szám tartozhat (és fordítva).
További
érdekes map-példa: ruhatári szituáció, amelyben értékként kezelt ruháinkat a
ruhatárnak nevezett tárolóegységbe (kell) tennünk. Az érték azonosítása nem
név, hanem egy egyedi kulcs alapján történik (számozott jegy, biléta). Tiltott
a többszörös kulcshasználat (adott számú biléta többször is előfordul), de
ebben a helyzetben 1 kulcshoz rendelhetünk több értéket is (1 biléta, több
kabát).
Queue (sor)
A FIFO (first-in-first-out) rendezőelv optimális adatszerkezete, amely
tárolási mód során (amint azt megtanulhattuk a
Sor és verem című fejezetből) az elemek
szekvenciálisan, egymás után követik egymást. Bár az adatszerkezet
legfontosabb tulajdonsága a szekvencialitás, azaz egymásutániság, létezhet
másfajta elemrendezési szempont is, például prioritás alapján. Az
adatszerkezet Java-implementációja erre és más rendezési szempontokra
alapjában véve felkészíthető.
Valós
életből vett példa: számítógépes utasítások szekvenciális sorrendje a műveleti
memóriában vagy bármely olyan tevékenység, amelyben nem lehet megtörni a
megszabott egymásutániságot.
A fenti kollekcióknak léteznek további specializációi is, ezek a kollekciók
önálló fejezeteiben kerülnek ismertetésre.