4. Datastructuren in Java Flashcards

1
Q

Waaruit bestaat het Collections Framework?

A

Dit framework bestaat uit drie delen:

  • interfaces
  • implementaties (= de concrete klassen)
  • algoritmes (=de methoden)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Wat is een interface?

A

Een interface stelt een abstract datatype voor.
Dit betekent dat voor de klassen die erven van de interface “contracten” worden afgesloten waaraan die klassen moeten voldoen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Wat zijn polymorfe collectionklassen?

A

Polymorfe collectionklassen maken het mogelijk elementen te verzamelen ongeacht het soort elementen dat we erin willen stoppen (bv. Student of Inschrijving).
Dit wordt bereikt door Object te kiezen als het type van de elementen.

ArrayList lijst = new ArrayList();
lijst.add(“hallo”);
Student k = new Student(“Katrien Deleu”);
lijst.add(k);
System.out.println(“lijst” + lijst);
> lijst[hallo, Katrien Deleu]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Wat is het nadeel van polymorfe collectionklassen?

A

Het nadeel van deze aanpak is dat ze niet type-safe is. Er is dus een cast nodig om het object in z’n juiste type terug te krijgen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Wat zijn generische collectionklassen?

A

Generische collectionklassen laten toe elementen van een zelfde type te verzamelen.
Dit wordt bereikt door de klassedefinitie te parametriseren met het type van de elementen.

ArrayList lijst = new ArrayList();
//lijst.add(“hallo”); –> compileert niet
Student k = new Student(“Katrien Deleu”);
lijst.add(k);
System.out.println(“lijst” + lijst);
> lijst[Katrien Deleu]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Wat is het voordeel van generische collectionklassen?

A

Deze aanpak is type-safe, de type informatie van de elementen blijft behouden en er moet niet gecast worden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

In welke package is het Java Collections Framework ondergebracht?

A

java.util

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Som de interfaces op van het Java Collections Framework.

A
  • Iterable
  • Collection
  • List
  • ListIterator
  • Queue
  • Deque
  • Set
  • SortedSet
  • Map
  • SortedMap
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Wat is een iterator?

A
Een iterator laat toe om elementen in een collectionklasse één voor één te overlopen.
---
Collection list = ... 
Iterator it = list.iterator(); 
while (it.hasNext()) {
  Student s = it.next();
... 
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Wat is het voordeel van een iterator?

A
Deze laat toe om de collection te wijzigen (bv. elementen verwijderen). 
---
Iterator it = list.iterator();
while (it.hasNext()){
  Student s = it.next(); 
  System.out.println(s); 
  it.remove(); // toegelaten
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Wat is een list?

A

Een sequentiële datastructuur; dit betekent dat de volgorde zoals de elementen opgeslagen zitten in de datastructuur van belang is.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Wat is een queue?

A

Een queue is abstract datatype en stelt een wachtrij (FIFO) voor.
De elementen worden altijd achteraan toegevoegd en vooraan verwijderd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Wat is een stack?

A

Een stack is een datastructuur die een stapel voorstelt (LIFO).
De elementen worden altijd vooraan toegevoegd en vooraan verwijderd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Wat is een deque?

A
Een deque (uitgesproken als dek) is een queue waar we aan beide uiteinden elementen kunnen toevoegen en verwijderen. 
De naam deque staat voor ‘Double-ended queue’. 
De Deque-interface omvat dus zowel de functionaliteiten van een queue als van een stack.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Wat is een set?

A

Een set is een verzameling van unieke elementen.
Dit betekent dat er geen twee gelijke elementen in een set aanwezig kunnen zijn.
Een set is in principe ongeordend, wat betekent dat wanneer we een set twee keer overlopen, de elementen niet noodzakelijk in de zelfde volgorde zullen weergegeven worden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Wat is een map?

A

Een map laat toe om elementen zo op te slaan dat ze eenvoudig aan de hand van een sleutel kunnen teruggevonden worden.
Elk gegeven wordt dus gekoppeld aan een sleutel.
Een map kan geen dubbele sleutels bevatten en elke sleutel komt overeen met exact één element.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Hoe gebeurt de ordening van een SortedSet/SortedMap?

A

De ordening gebeurt via de natuurlijke ordening van de elementen/sleutels of op basis van een Comparator die bij creatie van de SortedSet/SortedMap wordt meegegeven.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Wat zijn de opties om de ordening te regelen van collections waar elementen opgeslagen worden volgens een bepaalde ordening, zoals bij SortedSet en SortedMap?

A

De implementatie van deze interfaces moeten een methode voorzien die deze ordening regelt.
Dit kan de compareTo()-methode zijn van de Comparable-interface of de compare()-methode van de Comparator-interface.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Wat is het verschil tussen de Comparable en Comparator interface?

A

De Comparator-interface laat toe om een ordening te definiëren in een aparte klasse.
Er kan dan een object van die klasse meegegeven worden aan bijvoorbeeld de sort()-methode om de manier van ordenen te bepalen.
Dit laat toe om meerdere manieren van sorteren te definiëren voor eenzelfde soort objecten.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Wat is een arraylist?

A

Een arraylist is een sequentiële datastructuur en implementeert bijgevolg de List-interface.
In een arraylist is het belangrijk dat het opvragen van een element snel kan aan de hand van een index.
Deze structuur lijkt dus veel weg te hebben van een array, maar anders dan een array heeft een arraylist geen vaste grootte.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Wat zijn de belangrijkste methodes van een ArrayList?

A
  • add(e): element e achteraan toevoegen > O(1)
  • add(i,e): element e op index i toevoegen > O(n)
  • remove(i): element op index i verwijderen > O(n)
  • get(i): waarde van element op index i opvragen > O(1)
  • set(i,e): waarde van element op index i wijzigen in e > O(1)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Een array heeft een vaste grootte, hoe lost een ArrayList dit probleem op?

A

Het idee is om wanneer de array vol is, een nieuwe array te creëren die dubbel zo groot is en alle elementen over te zetten naar de nieuwe array.
Dit lijkt een trage oplossing te zijn, want het uitbreiden en alle elementen overzetten duurt O(n). Maar merk op dat wanneer de array uitgebreid is, er weer n elementen bij kunnen, vooraleer de uitbreiding nog eens plaats vindt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Wat is een LinkedList?

A

De LinkedList-class is een implementatie van een dubbel gelinkte lijst.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Wat zijn de belangrijkste methodes van een LinkedList?

A

Methoden overgeërfd van de Queue en Deque-interface:

  • addFirst(e): element e vooraan toevoegen > O(1)
  • addLast(e): element e achteraan toevoegen > O(1)
  • removeFirst(): eerste element verwijderen > O(1)
  • removeLast(): laatste element verwijderen > O(1)
  • getFirst(): waarde van eerste element opvragen > O(1)
  • getLast(): waarde van laatste element opvragen > O(1)

Methoden overgeërfd van de List-interface

  • add(e): element e achteraan toevoegen > O(1)
  • add(i,e): element e op index i toevoegen > O(n)
  • remove(): eerste element verwijderen > O(1)
  • remove(i): element op index i verwijderen > O(n)
  • get(i): waarde van element op index i opvragen > O(n)
  • set(i,e): waarde van element op index i wijzigen in e > O(n)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Wat is een circulaire uitbreidbare array?

A

Bij een circulaire uitbreidbare array zit het eerste element van de lijst in het midden van de array (zie Figuur 31). Op die manier is er ruimte om vooraan en achteraan toe te voegen.

26
Q

Wat is een hashfunctie?

A

De hashfunctie zet een element om naar een getal binnen een bepaald bereik, de hashcode genoemd. Deze code dient als index voor een tabel, de hashtabel. Verschillende elementen kunnen echter leiden tot eenzelfde hashcode. Een plaats in een hashtabel wordt daarom geassocieerd met een verzameling van elementen. Zo’n plaats in de hashtabel, waar verschillende elementen met eenzelfde hashcode in kunnen, noemen we een ‘bucket’.
De hashcode geeft bijgevolg terug waar een element moet zitten (welke bucket), maar het kan voorkomen dat daar nog gezocht moet worden tussen een aantal elementen in de bucket zelf.

27
Q

Wanneer is een object immutable?

A

Een object is immutable wanneer alle velden van het object onwijzigbaar zijn.

28
Q

Geef een voorbeeld van een immutable klasse?

A

Zo is bijvoorbeeld de klasse String immutable.

Om een string te wijzigen, wordt een nieuwe string gemaakt, met de aanpassingen in verwerkt.

29
Q

Wanneer zijn immutable klassen vooral belangrijk?

A

Bij multithreading.
Aangezien de toestand van een object niet kan wijzigen, kunnen er ook geen problemen ontstaan wanneer meerdere threads eenzelfde object raadplegen.

30
Q

Hoe maken we een klasse immutable?

A

Een klasse maken we immutable door volgende richtlijnen te volgen:
- Zorg dat niemand kan erven van de klasse door deze final te definiëren (public final class)
- Voorzie geen setters, maar schrijf een constructor die alle velden initialiseert, of zorg dat de setter een kopie retourneert.
- Voorzie ook geen methoden naast setters die toelaten de toestand van het object te wijzigen, of zorg dat de methode een kopie retourneert.
- Maak alle velden private én final. Op die manier kunnen de velden niet wijzigen.
- Wanneer de klasse velden bevat die een referentie hebben naar een mutable object, zorg
dan dat deze objecten niet gewijzigd kunnen worden.
- Voorzie dus een manier die toelaat om een echte kopie aan het veld toe te kennen (bij constructie) en een kopie weer te geven wanneer de getter wordt opgeroepen.

31
Q

Wat is een TreeSet?

A

Een TreeSet is een set in de vorm van een gebalanceerde binaire boom.
De elementen zitten dus in een gesorteerde volgorde in de boom.

32
Q

Wat is een binaire boom?

A

Een binaire boom is een datastructuur met knopen die telkens twee (binair) referenties hebben (links en rechts) naar andere knopen.
In Figuur 40 zien we een binaire boom, met een hoogte gelijk aan 2.

33
Q

Wanneer is een binaire boom gesorteerd?

A

Een binaire boom is gesorteerd als voor alle knopen geldt dat alle knopen in de linker subboom van een knoop een kleinere waarde hebben dan hun ouder en alle knopen in de rechter subboom van een knoop een grotere waarde hebben dan hun ouder.

34
Q

Wanneer is een gesorteerde binaire boom gebalanceerd?

A

Een gesorteerde binaire boom is gebalanceerd als voor elke knoop geldt dat de hoogte van de rechtersubboom en de linkersubboom maximum met 1 verschilt is.

35
Q

Wat is het grote verschil tussen een HashSet en een TreeSet?

A

Het grote verschil tussen een HashSet en een TreeSet zit hem in het feit dat de elementen in een HashSet niet gesorteerd zijn en bij een TreeSet wel.
Hierdoor is een HashSet sneller dan een TreeSet.
Wanneer de elementen niet gesorteerd moeten bijgehouden worden, gebruiken we beter een HashSet.

36
Q

Wat zijn de belangrijkste methodes van een TreeMap en een HashMap?

A
  • put(key, value): voegt de waarde value toe door de sleutel key aan waarde value te koppelen.
  • remove(key): verwijdert een paar (sleutel-waarde), door de koppeling tussen de sleutel key en de waarde value te verwijderen.
  • get(key): geeft de waarde gekoppeld aan de sleutel key terug.
  • containsKey(key): geeft true terug als de sleutel key gekoppeld is aan een waarde.
37
Q

Wat voorziet de interface Collection?

A

De basis functionaliteit voor collections.

38
Q

Wat zijn de functies van interface Collection?

A
  • int size()
  • boolean isEmpty()
  • boolean contains(Object element)
  • boolean add(E element)
  • boolean remove(Object element)
  • iterator iterator()

Functionaliteit om op volledige collections uit te voeren:

  • boolean containsAll(Collection> c)
  • boolean addAll(Collection extends E> c)
  • boolean removeAll(Collection> c)
  • boolean retainAll(Collection> c)
  • void clear()

Functionaliteit voor collections om te zetten naar arrays:

  • Object[] toArray()
  • T[] toArray(T[] a)
39
Q

Wat zijn de extra functies van interface List?

A

De functionaliteit van Collection wordt uitgebreid met
+ methoden die rekening houden met de positie van elementen, zoals in
- E get(int index)
- E set(int index, E element)
- void add(int index, E element)
- boolean addAll(int index, Collection extends E> c)
- E remove(int index)
- int indexOf(Object o)
- int lastIndexOf(Object o)
- List sublist(int fromIndex, int toIndex)
+ de mogelijkheid om gebruik te maken van de ListIterator.
- ListIterator listIterator()

40
Q

Wat biedt de ListIterator-interface?

A

Een iterator die toelaat om de lijst in twee richtingen te doorlopen.

41
Q

Wat zijn de functies van interface ListIterator?

A
  • void add(E e)
  • void remove()
  • void set(E e)
  • boolean hasNext()
  • boolean hasPrevious()
  • E next()
  • E previous()
  • int nextIndex()
  • int previousIndex()
42
Q

Wat zijn de extra functies van interface Queue?

A

Achteraan toevoegen:

  • boolean add(E e) > gooit een exception als dit niet lukt.
  • boolean offer(E e) > geeft false terug als dit niet lukt

Vooraan verwijderen:

  • E remove() > gooit een exception wanneer de queue leeg is.
  • E poll() > geeft null terug wanneer de queue leeg is.

Eerste element raadplegen:

  • E element() > gooit een exception wanneer de queue leeg is.
  • E peek() > geeft null terug wanneer de queue leeg is.
43
Q

Wat zijn de extra functies van het abstract datatype Stack?

A
  • E peek() > geeft het element vanboven op de stapel terug, zonder het te verwijderen.
  • E pop() > verwijdert het element vanboven op de stapel
  • void push(E e) > voegt een element toe vanboven op de stapel
44
Q

Wat zijn de extra functies van interface Deque?

A

Vooraan toevoegen:

  • void addFirst(E e) > exception
  • boolean offerFirst(E e) > return false

Achteraan toevoegen:

  • void addLast(E e) > exception
  • boolean offerLast(E e) > return false

Vooraan verwijderen:

  • E removeFirst() > exception
  • E pollFirst() > return null

Achteraan verwijderen:

  • E removeLast() > exception
  • E pollLast() > return null

Vooraan raadplegen:

  • E getFirst() > exception
  • E peekFirst() > return null

Achteraan raadplegen:

  • E getLast() > exception
  • E peekLast() > return null
45
Q

Wat zijn de extra functies van interface SortedSet?

A
  • SortedSet subset(E fromElement, E toElement)
  • SortedSet headSet(E toElement)
  • SortedSet tailSet(E fromElement)
  • E first()
  • E last()
  • Comparator super E> comparator()
46
Q

Wat zijn de extra functies van interface Map?

A
  • V put(K key, V value)
  • V get(Object key)
  • V remove(Object key)
  • boolean containsKey(Object value)
  • boolean containsValue(Object value)
  • int size()
  • boolean isEmpty()
  • void clear()
  • void putAll(Map extends K, ? extends V> m)
  • Set keySet()
  • Collection values()
  • Set> entrySet()
47
Q

Wat zijn de extra functies van interface SortedMap?

A
  • Comparator super K> comparator()
  • SortedMap subMap(K fromKey, K toKey)
  • SortedMap headMap(K toKey)
  • SortedMap tailMap(K fromKey)
  • K firstKey()
  • K lastKey()
48
Q

Waarvoor wordt een queue gebruikt?

A

Round Robin Scheduler

49
Q

Hoe werkt een Round Robin Scheduler?

A

o Processen krijgen elk om de beurt een vaste tijd toegekend
o Al deze processen worden in een queue geplaatst
o De processor wordt voor een bepaalde tijd aan het eerste proces in de queue toegekend
o Wanneer deze processortijd voorbij is, word dit procees achteraan in de queue gezet
o Op deze manier wordt aan elk proces even veel tijd gegeven tot het proces is afgewerkt.
♣ Als het proces is afgewerkt wordt het niet meer achteraan toegevoegd

50
Q

Hoe werkt een circulaire uitbreidbare array?

A

Het is gewoon kwestie van een referentie bij te houden naar het element dat het eerste element voorstelt in de array, en een referentie bij te houden naar het element dat het laatste element voorstelt in de array. Wanneer er op één van de uiteinden geen plaats meer is, voegen we deze aan het andere uiteinde toe (zie Figuur 34). We zien de array dus als een cirkel, waar we het begin (first) en het einde (last) extra van bijhouden.

51
Q

Hoe kan men een stack implementeren?

A

Met zowel een array als met een gelinkte lijst.

Er wordt aangeraden om de interface Deque te gebruiken om een stack te implementeren.

52
Q

Hoe wordt de plaats van een element in een HashSet bepaald?

A

Door de waarde van dat element.
Wanneer de elementen integers zijn, en de verschillende elementen niet te ver uiteen liggen, kunnen we de waarde van het element zelf gebruiken als index.
Bij elementen die objecten kan dit echter niet zomaar, en wordt er gebruik gemaakt van een hashfunctie.

53
Q

Waarvoor zorgt een goede hashfunctie?

A

Dat er zo weinig mogelijk gelijke waarde worden gegenereerd.

54
Q

Wat kunnen we opgeven bij het creëren van een HashSet?

A
  • capaciteit

- laadfactor

55
Q

Wat is de laadfactor van een HashSet?

A

De laadfactor geeft aan hoe vol de datastructuur mag zitten vooraleer deze wordt uitgebreid.

56
Q

Wat is de beste waarde voor de laadfactor van een HashSet?

A

Statistieken tonen aan dat een laadfactor van 75% voor een HashSet de beste waarde is.
Wanneer we de waarde hoger zetten, zal er minder verloren ruimte zijn, maar stijgt de kans dat verschillende elementen tot eenzelfde waarde leiden. Hoe meer elementen in dezelfde bucket terecht komen, hoe trager een element in de datastructuur wordt teruggevonden.

57
Q

De tijd nodig om alle elementen te overlopen in de HashSet is afhankelijk van…

A

…de capaciteit (het aantal buckets) en het aantal elementen die effectief in de HashSet zitten.

58
Q

Wat is de Big O van een HashSet?

A

O(1)

59
Q

Wat is de Big O van een TreeSet?

A

Doordat de boom gebalanceerd is, kan het zoeken in de binaire boom naar element met een uitvoeringstijd van O(log n).

60
Q

Hoe werkt een HashMap?

A

De sleutels worden omgezet naar een hashcode.

61
Q

Wat wordt er gesorteerd bijgehouden bij een TreeMap?

A

De sleutels.