java collections framework tutorial
Deze tutorial legt het Java Collections Framework (JCF) in detail uit, samen met de collectiehiërarchie, verschillende interfaces en de voordelen van JCF:
Ik hoop dat deze welsprekende tutorials hierover Java-serie voor beginners zijn erg behulpzaam bij het verrijken van uw kennis van Java.
Onze vorige tutorial gaf meer informatie over het basis I / O-bewerkingen in Java In deze tutorial zullen we in detail leren over Java Collections Framework (JCF).
Java Collections Framework (JCF) bevat interfaces, abstracte klassen en klassen die de architectuur kunnen bieden om een groep objecten op te slaan en te manipuleren.
Wat je leert:
- Videohandleidingen over Java Collections Framework
- Gevolgtrekking
Videohandleidingen over Java Collections Framework
Kennis van Arraylist in Java:
Stel Interface & Wachtrij-interface in Java in met realtime voorbeelden:
HashMap, TreeMap en HashTable in Java:
Tot nu toe hebben we variabelen gezien die verschillende soorten gegevens opslaan. Dit zijn enkelvoudige eenheden en zijn niet erg handig als u enorme hoeveelheden gegevens moet opslaan en verwerken. Zoals we weten, zijn gegevens het belangrijkste bestanddeel van computerverwerking.
Uw applicatie moet in staat zijn om gegevens te extraheren en te verzamelen, deze te verwerken om nuttige informatie te achterhalen en deze ook heen en weer te geven zodat deze efficiënt wordt gebruikt om tot de oplossingen te komen.
In deze softwarewereld slaan we de gegevens op die op een bepaalde manier moeten worden gestructureerd, zodat de softwareprogramma's de resultaten kunnen opslaan, lezen, verwerken en uiteindelijk uitvoeren. Dit gebeurt met behulp van datastructuren.
Bijna alle programmeertalen ondersteunen datastructuren. De gegevensstructuur kan worden gedefinieerd als een gestructureerde weergave van gegevens. Programmeertalen bieden API-functies (Application Programming Interface) om de datastructuren te manipuleren.
Need For Collection Framework
Vóór Java 1.2 ondersteunde de programmeertaal Java datastructuren zoals arrays, vectoren of hashtabellen. Het uitvoeren van bewerkingen op deze datastructuren was niet eenvoudig omdat er geen gemeenschappelijke interface was die op deze datastructuren werkte.
Programmeurs vonden het vroeger moeilijk om algoritmen te schrijven die voor alle datastructuren zouden werken, en dat was een groot gedoe. Er was behoefte aan een gemeenschappelijke interface die consistent zou werken op alle datastructuren en ook de operaties efficiënt zou uitvoeren.
Later kwam Java met een verzamelingsraamwerk dat een groep klassen en interfaces is die bestaat uit verschillende bewerkingen die kunnen worden uitgevoerd op gegevensstructuren.
In deze Java Collections-zelfstudie bespreken we het Java Collections Framework in het algemeen. We zullen elk van de collectiecomponenten verkennen in onze aankomende tutorials.
Java Collections Framework
Voordat we een Java Collections Framework gaan definiëren, moeten we eerst de betekenis van collection en een framework leren kennen.
Een verzameling kan worden gedefinieerd als een groep objecten. Een verzameling is meestal een enkele eenheid die uit meer dan één object bestaat. Een framework is software met een kant-en-klare functionele interface of architectuur en bevat ook een reeks klassen en interfaces die kunnen worden gebruikt met de meegeleverde interface.
Een verzamelingsraamwerk wordt gedefinieerd als een uniforme, kant-en-klare architectuur die bestaat uit het onderstaande.
# 1) Algoritmen
Dit zijn methoden of een reeks verklaringen die programmeurs kunnen helpen bij het zoeken, sorteren en verwerken van verzamelde gegevens. De collectie wordt geleverd met interfaces, klassen en algoritmen.
De applicaties die worden ontwikkeld door het overerven van het collectieframework hebben toegang tot deze algoritmen en gebruiken de reeds gedefinieerde methoden en procedures.
# 2) Interfaces
Interfaces in Java zorgen voor de abstractie van de implementatie, d.w.z. met behulp van interfaces is de gebruiker niet op de hoogte van de details van de implementatie, maar kan hij alleen de methoden en gegevens zien die nodig zijn om een applicatie te schrijven. De collectie-interface heeft veel interfaces die door de programmeur kunnen worden geïmplementeerd om hun eigen klassen te schrijven.
# 3) Klassen
De klassen van Collection Framework zijn datastructuren die in een programma kunnen worden geïmplementeerd. Deze klassen implementeren de 'Collectie' -interface en erven dus alle methoden en definities van de verzamelingsinterface.
Een collectieframework wordt gebruikt voor het opslaan en manipuleren van de collectie die de groep objecten is.
Het Java-verzamelingsraamwerk bestaat uit goed presterende algoritmen die standaardbewerkingen uitvoeren zoals zoeken, sorteren en verwerken. Het biedt verschillende standaardimplementaties, waaronder LinkedList, TreeSet en HashSet, waarvoor interfaces zijn voorzien.
Laten we vervolgens eens kijken naar de Java-verzamelingshiërarchie.
Hiërarchie van Java-verzamelingen
Alle klassen en interfaces die in de onderstaande Java Collection-hiërarchie worden weergegeven, behoren tot het pakket 'java.util. *'.
Zoals weergegeven in het bovenstaande diagram, bestaat de Java Collection-hiërarchie uit verschillende klassen en interfaces. Zoals je kunt zien, erft elke klasse van een interface en alle klassen en interfaces op hun beurt erven van een enkele 'collectie' -interface.
Laten we enkele veelgebruikte methoden in de verzamelingsinterface bespreken, samen met een korte inleiding over elk van de klassen en interfaces die in de bovenstaande hiërarchie worden weergegeven.
Collectie-interface
De collectie-interface is de root-interface. Alle klassen in het verzamelingsraamwerk implementeren de verzamelingsinterface. Dit betekent dat elke verzameling de methoden heeft die zijn gedeclareerd in de verzameling-interface.
Enkele van de methoden van de collectie-interface worden hieronder gegeven.
Niet doen | Methode Prototype | Omschrijving |
---|---|---|
7 | standaard boolean removeIf (predikaatfilter) | Verwijder alle elementen die voldoen aan het gegeven predikaat ‘filter’ uit de verzameling. |
1 | public int size () | Retourneert het aantal elementen in een bepaalde verzameling. |
twee | openbare leegte duidelijk () | Wist de verzameling door alle elementen uit de verzameling te verwijderen. |
3 | openbare boolean add (E e) | Voegt een element e in de verzameling in. |
4 | public booleanaddAll (verzameling c) | Voeg alle elementen uit de verzameling van c in de verzameling in. |
5 | openbare boolean remove (objectelement) | Verwijder element gegeven door ‘element’ uit de verzameling. |
6 | openbare boolean removeAll (Collectionc) | Haal de collectie c uit de collectie. |
8 | public booleanretainAll (Collectie c) | Verwijder alle elementen uit de verzameling behalve die in de opgegeven verzameling c. |
9 | openbare iterator iterator () | Retourneer iterator voor de verzameling. |
10 | openbaar object () toArray () | Zet de collectie om in een array. |
elf | openbare T () toArray (T () a) | Converteer de collectie naar een array met een opgegeven retourtype. |
12 | openbare boolean isEmpty () | Retourneer als de collectie leeg is of niet. |
13 | openbare boolean bevat (objectelement) | Controleer of een collectie het opgegeven element bevat (zoekbewerking). |
14 | openbare booleancontainsAll (Collectionc) | Controleer of de collectie de opgegeven collectie c bevat. |
vijftien | standaard Spliterator spliterator () | Retourneert spliterator over een opgegeven verzameling. |
16 | public booleanequals (objectelement) | Wordt gebruikt voor het matchen van twee collecties. |
17 | standaard Stream parallelStream () | Retourneert een parallelle stream met de collectie als bron. |
18 | standaard Streamstream () | Retourneert een sequentiële stream met de collectie als bron. |
19 | openbare int hashCode () | Retourneert een numerieke hashcode van de verzameling. |
Herhaalbare interface
De itereerbare interface is ook de basisinterface van het verzamelframework. De verzamelingsinterface die de bovenliggende interface is van alle andere klassen, breidt de herhaalbare interface uit. Daarom implementeren alle klassen zowel een verzamelingsinterface als een herhaalbare interface.
De Iterable-interface heeft slechts één methode iterator () die de iterator () retourneert die u kunt gebruiken om de elementen van het type T te herhalen.
Iterator-interface
De Iterator-interface biedt de mogelijkheid om de elementen in voorwaartse richting te herhalen.
Hieronder volgen de methoden die door deze interface worden ondersteund.
Niet doen | Methode Prototype | Omschrijving |
---|---|---|
1 | openbaar object volgende () | Geeft eerst het element terug en verplaatst vervolgens de cursor om naar het volgende element te wijzen. |
twee | openbare boolean hasNext () | Controleert of de iterator meer elementen heeft. |
3 | public void remove () | Verwijdert het element dat uiteindelijk door de iterator wordt geretourneerd. |
Lijstinterface
De lijstinterface neemt de verzamelingsinterface over. Lijstinterface bevat de datastructuren die worden gebruikt om geordende gegevens of verzameling objecten op te slaan. Deze datastructuren zijn van een lijsttype. Deze datastructuren die de lijstinterface implementeren, kunnen al dan niet dubbele waarden hebben.
Lijstinterface bevat de methoden die worden gebruikt om toegang te krijgen tot elementen, in te voegen of om elementen uit de lijstobjecten te verwijderen.
Verschillende klassen die de List-interface implementeren, zijn als volgt:
hoe je een mkv-bestand op Windows afspeelt
- ArrayList
- LinkedList
- Vector
- Stapel
We zullen elk van deze lessen kort bespreken. Onze volgende onderwerpen zullen een gedetailleerde bespreking hebben over elk van de collectiekaderklassen.
# 1) ArrayList
ArrayList is de eenvoudigste implementatie van de List-interface. ArrayList behoudt de invoegvolgorde en wordt niet gesynchroniseerd.
De algemene definitie van ArrayList-gegevensstructuur (Verzameling) is als volgt:
Zodra de lijst is gedefinieerd, kunt u de ‘add’ -methode gebruiken om elementen toe te voegen. Merk op dat de ArrayList intern een dynamisch array-mechanisme heeft gebruikt.
Bekijk de volgende voorbeelden waarmee u een ArrayList-kleurencollectie maakt.
Uitgang:
Het bovenstaande programma toont de demonstratie van de ArrayList-collectie. We voegen kleurwaarden toe aan de collectie en doorlopen de collectie om individuele waarden in de collectie weer te geven met behulp van een iterator.
# 2) LinkedList
De LinkedList-verzameling gebruikt intern een dubbel gekoppeld lijstmechanisme voor het opslaan van elementen. Het kan dubbele elementen bevatten. Het verzamelen van LinkedList gaat sneller omdat het verplaatsen van elementen niet nodig is.
De algemene definitie van het maken van een gekoppelde lijst is als volgt:
Het volgende programma demonstreert de gekoppelde lijst met nummernamen
Uitgang:
We maken dus een gekoppelde lijst en voegen er vervolgens elementen aan toe met behulp van de ‘add’ -methode. Met behulp van een iterator doorlopen we de gekoppelde lijst en geven we elk element weer.
# 3) Vector
Vector is vergelijkbaar met ArrayList en gebruikt een dynamische array om de elementen op te slaan, zoals ArrayList. Maar vector ondersteunt veel onafhankelijke methoden, afgezien van de verzameling, waardoor het een betere keuze is om een voorkeurscollectie te zijn.
De algemene definitie voor vectorverzameling is:
Merk op dat hoewel vector en ArrayList hetzelfde mechanisme van dynamische arrays gebruiken, de vectorelementen gesynchroniseerd zijn.
Het onderstaande Java-programma demonstreert het gebruik van vectoren in het verzamelframework
Uitgang:
In dit programma hebben we een vectorcollectie gedefinieerd die bestaat uit onderwerpen. We voegen verschillende onderwerpen toe en gebruiken vervolgens een iterator om de elementen uit te voeren.
# 4) Stapel
Stack datastructuur implementeert de laatste-in-eerst-uit (LIFO) manier om elementen in te voegen. De stapel is een subklasse van de klassevector (zie het verzamelingshiërarchiediagram hierboven). Afgezien van zijn eigen methoden, ondersteunt de stapelverzameling ook de methoden van vectorverzameling.
De algemene definitie van Stack-verzameling is:
Het volgende programma implementeert Stack collection
Uitgang:
Zoals u kunt zien in de bovenstaande implementatie, worden de nieuwe elementen aan de stapel toegevoegd met behulp van de 'Duwen' operatie. De stapel heeft één toegangspunt genaamd ‘Top of the stack’ en de elementen worden bovenaan op de stapel geschoven. Het laatste toegevoegde element bevindt zich dus bovenaan de stapel.
Net als bij het toevoegen, worden elementen ook aan het ene uiteinde verwijderd, d.w.z. aan de bovenkant van de stapel. Om elementen te verwijderen wordt een operatie ‘pop’ gebruikt. Dus als je pop () aanroept, wordt het element bovenaan de stapel verwijderd.
In de bovenstaande uitvoer voegen we het element 2, 4, 6,8,10 in en bellen vervolgens pop () zodat 10 wordt verwijderd.
Wachtrij-interface
De verzamelingen die zijn afgeleid van de wachtrijinterface, volgen de volgorde van eerst in, eerst uit (FIFO). De elementen worden aan het ene uiteinde ingevoegd en aan het andere uiteinde verwijderd. Daarom is het element dat als eerste wordt ingevoerd, het element dat als eerste wordt verwijderd.
Hieronder staan de collecties die de zoekinterface ondersteunen.
- Prioriteits-rij
- en interface
- ArrayDeque
Laten we ze allemaal kort bespreken.
# 1) PriorityQueue
In de PriorityQueue-verzameling worden de opgeslagen elementen verwerkt op basis van hun prioriteiten. U kunt geen null-waarden opslaan in de prioriteitswachtrij.
De algemene definitie van de prioriteitswachtrij is als volgt:
Het onderstaande programma implementeert de prioriteitswachtrij.
Uitgang:
Opnieuw gebruiken we kleuren als elementen van de prioriteitswachtrij. In het bovenstaande programma hebben we de methoden toevoegen en verwijderen gebruikt om respectievelijk elementen aan de wachtrij toe te voegen en een element te verwijderen. We gebruiken de methode peek () die een element retourneert waarnaar het verwijst in de prioriteitswachtrij.
Ten slotte worden met behulp van een iterator de elementen van de prioriteitswachtrij weergegeven.
# 2) aanraakinterface
Deque of een ‘dubbele wachtrij’ is een gegevensstructuur waarmee u de elementen aan beide uiteinden kunt toevoegen en verwijderen. De deque-interface in het Java-verzamelframework dat de wachtrij-interface uitbreidt.
Het biedt de functionaliteit van deque en heeft een klasse een ‘ArrayDeque’ die ervan overerft.
# 3) ArrayDeque
ArrayDeque implementeert de deque-interface.
De algemene definitie van ArrayDeque is als volgt:
Met ArrayDeque kunt u de functionaliteit van Deque gebruiken. In tegenstelling tot andere collecties zoals ArrayList of stack, heeft ArrayDeque geen beperkingen op de capaciteit.
Het volgende voorbeeld toont de implementatie van ArrayDeque.
Uitgang:
In het bovenstaande programma definiëren we een ArrayDeque-verzameling van het type integer en voegen we integer-elementen toe met behulp van de add-methode. De verzameling wordt vervolgens doorlopen met de for-constructie.
Stel interface in
De set-interface is een onderdeel van het pakket java.util en strekt zich uit van de collectie-interface. Set is een structuur die niet toestaat dat de verzameling dubbele waarden heeft en ook meer dan één null-waarde.
De volgende klassen implementeren de set-interface.
- HashSet
- LinkedHashSet
- TreeSet
# 1) HashSet
HashSet-verzameling die de Set-interface implementeert, heeft verschillende waarden die erin zijn opgeslagen. Deze collectie gebruikt de hash-techniek om de items op te slaan en gebruikt de hashtabel voor het opslaan van elementen.
T De algemene definitie van de HashSet-verzameling wordt hieronder weergegeven.
We hebben de implementatie van HashSet in het volgende programma gegeven.
Uitgang:
In het bovenstaande programma maken we een HashSet-verzameling onderwerpen en doorlopen we deze met een iterator om de elementen in de verzameling weer te geven.
# 2) LinkedHashSet
LinkedHashSet implementeert een vaste interface en breidt HashSet uit (zie collectiehiërarchie). LinkedHashSet is de weergave van de gekoppelde lijst van de interfaceset. LinkedHashSet bevat unieke elementen maar staat null-waarden toe.
De algemene definitie van LinkedHashSet wordt hieronder gegeven.
De implementatie voor LinkedHashSet wordt hieronder gegeven.
Uitgang:
We maken wederom gebruik van boektitels voor het maken van Linkedhashset. Zoals u aan de uitvoer kunt zien, wordt de volgorde van toevoeging gehandhaafd door linkedHashSet.
SortedSet-interface
De SortedSet-interface maakt een volledige ordening van elementen mogelijk. Het bevat methoden die zorgen voor een natuurlijke ordening van elementen. Elementen in de collectie die de SortedSet-interface implementeren, zijn in oplopende volgorde gerangschikt.
TreeSet-klasse is een van de voorbeelden die de SortedSet-interface implementeert.
Treeset
De algemene definitie van Treeset is als volgt:
TreeSet implementeert de SortedSet-interface en bevat unieke elementen. Het opslaan en ophalen gaat vrij snel en vervolgens worden de elementen in oplopende volgorde gerangschikt.
Uitgang:
In het bovenstaande programma hebben we oneven nummers gemaakt en aan de verzameling toegevoegd met behulp van add-methoden. Vervolgens gebruiken we een iterator om de elementen in de verzameling uit te voeren.
Voordelen van Java Collections Framework
- Minder programmering: Het Collections-framework wordt geleverd met alle interfaces en klassen die de methoden bevatten waarmee programmeurs een efficiënt programma kunnen schrijven. Op deze manier hoeft de programmeur zich niet te concentreren op teveel programmeren.
- Consistente methoden en API: Alle klassen hebben gemeenschappelijke methoden die op gegevens reageren. Deze API's zijn consistent door de klassen heen en de programmeur hoeft zich geen zorgen te maken over te veel verschillende methoden voor elke klasse.
- Verhoog snelheid en nauwkeurigheid: U kunt zeer efficiënte programma's schrijven met behulp van een verzamelframework en ook snellere en nauwkeurige programma's, aangezien het verzamelingsraamwerk de volledige functionaliteit biedt om de datastructuren en verzamelingen te implementeren.
- Vergemakkelijkt hergebruik van software: Datastructuren en algoritmen van het Java-verzamelingsraamwerk zijn herbruikbaar.
- Interoperabiliteit tussen niet-gerelateerde API's: Collectie-API's maken interoperabiliteit mogelijk, zelfs tussen niet-gerelateerde API's.
- Minder inspanningen om nieuwe API's te ontwerpen: Programmeurs kunnen de standaard collectie-API's gebruiken en op basis daarvan nieuwe API's ontwerpen. Ze hoeven niet te worstelen om compleet nieuwe API's te schrijven.
Veel Gestelde Vragen
# 1) Wat is het gebruik van een collectieframework in Java?
qtp interviewvraag en antwoorden voor ervaren
Antwoord: Collection-framework biedt voorverpakte algoritmen, interfaces en klassen waarmee programmeurs zeer efficiënte programma's kunnen schrijven die gegevens kunnen opslaan en verwerken.
# 2) Waarom is collectie een raamwerk?
Antwoord: Een framework is een herbruikbare verzameling klassen, interfaces en algoritmen. Het verzamelingsraamwerk is ook een herbruikbare verzameling gegevensstructuurklassen en algoritmen die op deze klassen werken.
# 3) Wat is Java Collections API in Java?
Antwoord: De Java Collections API biedt interfaces en klassen die kunnen worden uitgebreid en geïmplementeerd om datastructuren te gebruiken die niets anders zijn dan verzamelingen.
# 4) Wat is het verschil tussen verzameling en verzamelingen in Java?
Antwoord: De verzameling is een basisinterface in het verzamelingsraamwerk, terwijl 'verzamelingen' een klasse is. Beide maken deel uit van het pakket java.util.
Meer details en voorbeelden van het Java Collections Framework:
Vergelijking tussen lijst, set en wachtrij:
Lijst | Set | Wachtrij |
---|---|---|
De invoegopdracht wordt gehandhaafd | De invoegopdracht wordt niet bijgehouden in de hash-set | De invoegopdracht wordt gehandhaafd. |
Kan dubbele elementen bevatten | Mag geen dubbele elementen bevatten | Kan dubbele elementen bevatten. |
Het invoegen en verwijderen van een array is mogelijk voor elke index. | Verwijder het gespecificeerde element. | Alleen het laatst ingevoegde element kan worden uitgeklapt. Het invoegen van elementen gebeurt ook aan het einde. |
Klasse matrixlijst
In Array staat de geheugentoewijzing vast. Maar in ArrayList kan geheugen dynamisch worden toegewezen. Deze klasse ArrayList handhaaft de invoegvolgorde en u kunt dubbele elementen invoegen.
Demoprogramma voor Array List:
LinkedList-klasse
De datastructuur van de gekoppelde lijst bevat knooppunten en dit knooppunt zal twee delen bevatten:
- Gegevens
- Verwijzing naar het volgende element
Het eerste knooppunt is geen afzonderlijk knooppunt. Het bevat alleen de referentie en wordt een hoofd genoemd. Het laatste knooppunt is null.
Demoprogramma:
Wachtrij
Een wachtrij is first in first out (FIFO) datastructuur. Als u de verwijdermethode aanroept, wordt altijd het eerste ingevoegde element uit de wachtrij verwijderd. Queue wordt dus gebruikt in real-time applicaties waar de gegevens moeten worden opgehaald in de ingevoegde volgorde.
Voorbeeldprogramma:
Set
Een vaste verzameling staat geen dubbele elementen toe. U kunt een vaste datastructuur gebruiken als u de gegevensverzameling wilt verwerken zonder duplicatie en als het niet nodig is om de invoegvolgorde te handhaven.
Demoprogramma:
MAP-interface
- Als u een procesverzameling van elementen met het sleutel- en waardepaar wilt, dan kunt u de kaartgegevensstructuur gebruiken, aangezien de kaart een object is dat sleutels kan toewijzen aan waarden.
- Een kaart kan geen dubbele sleutels bevatten.
- De belangrijke implementaties van map zijn HashMap, Treemap, LinkedHashMap, HashTable.
Verschil tussen HashMap, Treemap, LinkedHashMap en HashTable:
Hash kaart | TreeMap | LinkedHashmap | HashTable |
---|---|---|---|
Null-sleutels en waarden zijn toegestaan | Alleen null-waarden toegestaan. | Null-sleutels en waarden toegestaan. | Het staat geen null-sleutels en -waarden toe. |
Niet gesynchroniseerd | Niet gesynchroniseerd | Niet gesynchroniseerd | gesynchroniseerd |
Er is geen garantie om de orde in de iteratie te behouden | Het sorteren gebeurt op basis van natuurlijke volgorde. | De invoegopdracht wordt gehandhaafd | Invoegopdracht niet behouden. |
Demoprogramma:
Belangrijkste punten om op te merken:
- Lijst-, wachtrij-, set-interfaces breiden de collectie-interface uit en deze collectie-interface heeft gemeenschappelijke methoden zoals toevoegen, verwijderen enz.
- De invoegvolgorde wordt behouden in de lijst en een set kan geen dubbele elementen bevatten. Wachtrij is de eerste in de eerste gegevensstructuur.
- De kaart bevat sleutel- en waardeparen. HashMap, Treemap, Hashtable, Linked HashMap zijn de belangrijke implementatie van de kaartinterface.
Gevolgtrekking
Deze tutorial gaf ons een inleiding tot het Java Collections Framework. We hebben kort alle klassen en interfaces besproken die deel uitmaken van het Java-verzamelframework.
In onze volgende tutorials in deze serie zullen we in detail over elk van deze klassen en interfaces leren.
Je kunt meer ontdekken over Reflections in JAVA in onze aankomende tutorial !!!
PREV-zelfstudie VOLGENDE zelfstudie
Aanbevolen literatuur
- Zelfstudie over reflectie in Java met voorbeelden
- Diepgaande Eclipse-zelfstudies voor beginners
- Java SWING-zelfstudie: afhandeling van containers, componenten en gebeurtenissen
- JAVA-zelfstudie voor beginners: 100+ praktische Java-videotutorials
- Toegang tot modificatoren in Java - zelfstudie met voorbeelden
- Java String met String Buffer en String Builder Tutorial
- Inleiding tot de programmeertaal van Java - videozelfstudie
- Cucumber Selenium Tutorial: Cucumber Java Selenium WebDriver Integration