Programmeren in Java/Collections
Een collectie is een verzameling van referenties naar objecten (geen primitieve waarden) die:
- zijn eigen grootte beheert (er hoeft zelfs geen begin-grootte opgegeven worden), dit is in tegenstelling tot arrays.
- een rijke verzameling methoden bezit om elementen toe te voegen, te verwijderen, te sorteren, op te zoeken, ...
Soorten interfaces
[bewerken]- De Collection-interface die een verzameling van referenties bevat. Deze interface wordt op zich geïmplementeerd door drie andere interfaces:
- List is een opeenvolging van elementen, dubbelingen mogen: ArrayList
- Set met elementen zonder duplicaten: HashSet, LinkedHashSet
- SortedSet met strikt geordende elementen, ofwel via natuurlijke ordening (Comparable) ofwel via een Comparator: TreeSet
- Queue is een hoop elementen die er uitgehaald worden in de omgekeerde volgorde van het toevoegen (FIFO: first in, first out); de queue-interface bevat extra methods om elementen toe te voegen en weg te halen: LinkedList, PriorityQueue
- De Map-interface die de elementen toegankelijk maakt via aparte sleutelobjecten, zoals bij een hashtabel: HashMap, LinkedHashMap
Voorbeeld
[bewerken]Onderstaande is een kort voorbeeld van het gebruik van een ArrayList, wat een implementatie is van de List-interface.
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<>();
String text = "Stuk tekst.";
strings.add(text);
System.out.println(strings.get(0)); // Geeft als output: "Stuk tekst."
}
}
In dit voorbeeld gebruiken we het sleutelwoord import om de ArrayList toe te voegen. Op regel 5 declareren we een ArrayList en geven we mee tussen de haakjes (<>) dat deze enkel Strings mag bevatten, na het =-teken makken we de ArrayList aan zoals we dat doen bij andere objecten. In regel 6 wordt er een String aangemaakt die in regel 7 toegevoegd word aan de ArrayList. In regel 8 wordt die er terug uitgehaald en uitgeprint.
Niet generisch
[bewerken]Sinds de introductie van generische klassen in Java 1.5 is het mogelijk om te bepalen welke type klassen een collectie of map mag bevatten. Voordien was dit niet mogelijk en kon je niet aangeven wat voor soort objecten worden bewaard in de collectie. Door deze ontbrekende informatie was het aan de programmeur om elementen terug te casten in de juiste klasse als het bijvoorbeeld methodes van die specifieke klasse wilt gebruiken.
Collection
[bewerken]Deze interface is de hoofdinterface binnen de hele hiërarchie van de collection-interfaces. Een collection bevat een groep van objecten, ook wel elementen genoemd. Sommige collections laten duplicaten toe, andere dan weer niet. Sommige zijn dan weer geordend, andere niet. De standaard Java-bibliotheek heeft geen enkele collectionklasse die deze interface rechtstreeks implementeert. Deze interface wordt op zich geïmplementeerd via drie andere interfaces, namelijk List, Set en Queue. Die worden op zich geïmplementeerd door echte collections of via andere interfaces.
Deze interface bevat onder andere volgende methodes:
- add(E e): Voegt één element toe aan de collectie.
- addAll(Collection<? extends E> c): Voegt de elementen van de gegeven collectie toe aan de collectie.
- clear(): Verwijdert alle elementen uit een collectie. Enkel uit de collectie, het object zelf wordt niet verwijderd zolang het ergens anders nog wordt bijgehouden bijvoorbeeld in een variabele of een andere collectie.
- contains(Object o): Kijkt of de collectie een bepaald object bevat, geeft true terug als dat zo is.
- containsAll(Collection<?> c): Kijkt of de collectie alle elementen bevat die zich in de meegegeven collectie bevind, geeft true terug als dat zo is.
- isEmpty(): Geeft true terug als de collectie leeg is (nul elementen bevat).
- iterator(): Geeft een iterator terug over deze collectie.
- remove(Object o): Verwijdert het gegeven object uit de collectie.
- removeAll(Collection<?> c): Verwijdert alle elementen uit de collectie die ook bestaan in de gegeven collectie.
- retainAll(Collection<?> c): Verwijdert alle elementen uit de collectie die niet aanwezig zijn in de gegeven collectie.
- size(): Geeft terug hoeveel elementen de collectie bevat.
- toArray(): Geeft een array terug die de elementen bevat van de collectie.
- toArray(T[] a): Geeft een array terug die de elementen bevat van de collectie, met het verschil dat de array het datatype heeft van de meegegeven array.
List
[bewerken]Binnen een List kunnen elementen in een bepaalde volgorde worden geplaatst en kunnen net zoals bij een array worden opgehaald door middel van een index. In tegenstelling tot een Set mag een List hetzelfde object meerdere keren bevatten. Het heeft volgende implementaties in de package java.util:
- ArrayList
- LinkedList
- Stack
- Vector
Set
[bewerken]Queue
[bewerken]Map
[bewerken]Eigen collectie
[bewerken]Je kunt een eigen implementatie ontwikkelen van deze interfaces, dit gebeurt op dezelfde manier als het implementeren van elke ander type interface via het sleutelwoord implements.
public class OwnImplementationOfList<E> implements List<E> {
}
Je bent dan natuurlijk wel verplicht om all methodes van die interface te implementeren. Hierbij moet je dan ook rekening houden met wat de regels zijn voor iedere methode die je implementeert. Dit doe je door naar de javadoc te kijken van de interface die je implementeer. Bijvoorbeeld:
/**
* Returns {@code true} if this list contains no elements.
*
* @return {@code true} if this list contains no elements
*/
@Override
public boolean isEmpty() {
//jouw code
}
De method isEmpty() moet dus true geven als hij leeg is, de implementatie die je dan schrijft moet dus verplicht true geven als je collectie geen elementen meer bevat. Het niet volgen van deze regels kan gevolgen hebben voor andere code of kan verwarring veroorzaken bij andere ontwikkelaars.
Alternatief kan je voortbouwen op een gedeeltelijke implementatie:
public class OwnExtensionOfAbstractList<E> extends AbstractList<E> {
}
Nu ben je alleen maar verplicht om get(int) en size() te implementeren. De gedeeltelijke implementatie maakt hiervan gebruik, bv:
@Override
public boolean isEmpty() {
return size() == 0;
}