Modulelessen (2/2)
Verzamelingen en ArrayList
Traditionele arrays in Java hebben een vaste grootte die is gedefinieerd op het moment van creatie. Om te werken met lijsten met gegevens waarvan de grootte dynamisch kan variëren, biedt Java het Java Collections Framework. De meest gebruikte klasse is ArrayList.
De klasse ArrayList en generieken
ArrayList implementeert een aanpasbare array in het geheugen. Om een ArrayList te declareren, moeten we het type elementen specificeren dat het zal bevatten door het tussen punthaken < > te plaatsen. Deze functie heet Generische.
Om ArrayList te gebruiken, moeten we het aan het begin van het bestand importeren uit java.util.ArrayList.
Verklaring en instantiatie:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();Kernmethoden
Dit zijn de fundamentele bewerkingen op een ArrayList:
add(element): Voegt een element toe aan het einde van de lijst.get(index): retourneert het element op de opgegeven index (0-geïndexeerd).size(): Retourneert het aantal elementen dat momenteel in de lijst staat.remove(index): verwijdert het element op de opgegeven index.
shoppingList.add("Pane");
shoppingList.add("Latte");
System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"Een lijst herhalen (voor elk)
De for-each-lus is de ideale structuur om alle elementen van een verzameling te doorlopen:
for (String item : shoppingList) {
System.out.println(item);
}Array versus ArrayList: geheugen en prestaties
Hoewel ArrayList veel flexibeler is dan een statische array, gaat het gepaard met compromissen op het gebied van prestaties en geheugen:
- Statische array: deze wordt toegewezen in een aaneengesloten geheugenblok, heeft een vaste grootte en de toegang tot elementen via index is extreem snel. Het slaat primitieve typen direct op, zonder overhead.
- ArrayList: intern beheert het een array waarvan de grootte wordt gewijzigd (door een nieuwe, grotere array te maken en oude elementen te kopiëren) wanneer de initiële capaciteit (meestal 10) wordt overschreden. Bovendien slaat het alleen objectreferenties op, waardoor voor elk element geheugenoverhead wordt geïntroduceerd.
Autoboxen en unboxen
Omdat ArrayList alleen objecten kan bevatten, voert Java automatisch conversies uit tussen primitieve typen en hun respectievelijke wrapper-klassen:
- Autoboxing: automatische conversie van een primitief type naar een wrapper-klasse. Wanneer u bijvoorbeeld
numbers.add(42)schrijft, converteert Java automatisch42(int) naarInteger.valueOf(42)(geheel getal). - Unboxing: automatische conversie van een wrapper-klasse naar een primitief type. Wanneer u bijvoorbeeld
int num = numbers.get(0)uitvoert, converteert Java internIntegernaarint.
Probeer het zelf
Importeer ArrayList, declareer een ArrayList met namen met tekenreeksen. Voeg Alice en Bob toe aan de lijst en druk vervolgens de grootte ervan af met behulp van de size() methode.
Toon hint
Voeg bovenaan 'import java.util.ArrayList;' toe. Maak de lijst met `ArrayList<String> namen = new ArrayList<>();`, voeg de elementen toe en druk de grootte ervan af met `names.size()`.
Oplossing beschikbaar na 3 pogingen
Declareer een ArrayList met gehele getallen met de naam, voeg het getal 42 toe en druk het af door het op te halen bij index 0 met behulp van get().
Toon hint
Gebruik `ArrayList<Integer> getallen = new ArrayList<>();` (met de Integer wrapper-klasse) en druk het af met `System.out.println(numbers.get(0));`.
Oplossing beschikbaar na 3 pogingen
Declareer een ArrayList van String met de naam kleuren. Voeg de kleuren Rood, Groen en Blauw toe aan de lijst. Gebruik ten slotte een for-each-lus om door de lijst te lopen en elke kleur op het scherm af te drukken.
Toon hint
Declareer de lijst met `ArrayList<String> kleuren = new ArrayList<>();`, voeg de drie kleuren toe en gebruik een lus `for (String c: kleuren)` om ze af te drukken met `System.out.println(c);`.
Oplossing beschikbaar na 3 pogingen