Lijsten, arrays en strings in Java

Leer veel waarden in Java op te slaan en met tekst te werken. Maak ArrayLists en arrays, voeg elementen toe, wijzig, verwijder en zoek ze, en verwerk ze met lussen met index en for-each-lussen om totalen, gemiddelden en maxima te berekenen. Werk daarna met tekst via String-methoden: zoek delen en haal ze eruit, splits regels in velden, vergelijk strings correct met equals en bouw langere tekst efficiënt op met StringBuilder.

BeginnerLes 4 van 11 in Cursus Java programmeren: klassen, overerving, collecties en streams

Wat je leert

  1. Maak ArrayLists, voeg elementen toe, lees, vervang en verwijder ze, controleer wat een lijst bevat en begrijp wat er gebeurt als een lijst wordt gedeeld of aan een methode wordt doorgegeven.
    • Maak een lijst en benader elementen via hun index
      Importeer en maak een ArrayList, voeg elementen toe, lees en vervang ze via hun index en blijf binnen het geldige indexbereik.
    • Verwijder elementen en controleer wat een lijst bevat
      Verwijder elementen op index of op waarde, zoek waarden met contains en indexOf en vermijd de valkuilen van Integer-lijsten en verschuivende indexen.
    • Deel lijsten tussen variabelen en methoden
      Leg uit wat een lijstvariabele bevat, wat er gebeurt als een lijst wordt toegewezen of aan een methode wordt doorgegeven, hoe je een lijst kopieert en hoe je twee lijsten vergelijkt.
  2. Maak arrays, lees en schrijf hun elementen, geef arrays correct door en kopieer ze, en kies tussen een array en een ArrayList.
    • Maak arrays en benader hun elementen
      Declareer en maak arrays, vul ze, lees en schrijf elementen via hun index en weet wat hun lengte en standaardwaarden zijn en hoe je ze afdrukt.
    • Geef arrays door, kopieer en vergelijk die, en kies tussen arrays en lijsten
      Leg arrayreferenties uit, kopieer en vergelijk arrays correct, verwissel elementen en bepaal wanneer een array of een ArrayList bij de taak past.
  3. Bezoek elk element met lussen met index en for-each-lussen, bereken totalen, gemiddelden en extrema, zoek waarden en wijzig een lijst veilig terwijl je die doorloopt.
    • Doorloop lijsten en arrays met for en for-each
      Schrijf lussen met index en for-each-lussen over lijsten, arrays en de tekens van een string en kies de juiste lus voor de taak.
    • Bereken totalen, gemiddelden, aantallen en extrema
      Gebruik accumulatorvariabelen om sommen, gemiddelden, aantallen, maxima en minima te berekenen en bouw een gefilterde lijst op.
    • Zoek een waarde in een lijst of array
      Schrijf lineaire zoekacties die een positie, een ja-of-neeantwoord of alle overeenkomsten teruggeven en zoek op een voorwaarde in plaats van op een exacte waarde.
    • Wijzig een lijst veilig terwijl je die doorloopt
      Verwijder of voeg elementen toe tijdens een lus zonder elementen over te slaan of een exceptie te veroorzaken en kies daarvoor een veilige manier.
  4. Behandel een string als een reeks tekens, zoek delen en haal ze eruit, schoon de string op en zet tekstregels om in gegevens en omgekeerd.
    • Lees de tekens van een string
      Gebruik length en charAt, doorloop tekens, werk met char-waarden, voeg tekst samen met + en begrijp dat strings niet kunnen veranderen.
    • Zoek delen van een string, haal die eruit en schoon die op
      Zoek tekst met indexOf en contains, haal delen eruit met substring en wijzig hoofdletters, spaties en inhoud met replace, trim en verwante methoden.
    • Splits tekst in delen en zet tekst om naar getallen
      Splits een regel met split in velden, zet velden om naar getallen en getallen naar tekst, controleer de delen en voeg ze weer samen.
  5. Vergelijk strings op inhoud en op alfabetische volgorde en gebruik StringBuilder om tekst stap voor stap op te bouwen en te bewerken.
    • Vergelijk strings met equals en compareTo
      Gebruik equals en equalsIgnoreCase om de inhoud te testen, vermijd de valkuil van == en fouten door null en gebruik compareTo om strings te ordenen.
    • Bouw en bewerk tekst met StringBuilder
      Gebruik StringBuilder om tekst in een lus op te bouwen en ter plaatse te bewerken, zet het resultaat om naar een String en vermijd veelgemaakte fouten met StringBuilder.

Lijsten, arrays en strings in Java: uitleg

5 hoofdstukken

1

Sla gegevens op in een ArrayList en beheer die

Een ArrayList bewaart verwante waarden in één geordende collectie, ook als je het uiteindelijke aantal niet kent. Werk van het maken van een lijst met een type naar het invoegen, vervangen, verwijderen en vinden van elementen op index of waarde. Volg daarna wat er gebeurt als twee variabelen of een methode die lijst delen, zodat je kunt kiezen tussen bestaande gegevens wijzigen en een afzonderlijk resultaat maken.

1.1 Maak en bewerk een ArrayList

Een ArrayList bewaart waarden op volgorde. De lijst groeit als je een element toevoegt en krimpt als je er een verwijdert. Elk element heeft een index, die begint bij 0. Importeer de klasse voordat je die gebruikt: import java.util.ArrayList;.

Maak een lijst met een type
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");

Het type in <String> geeft aan wat de lijst opslaat. Met de diamantoperator <> rechts kan Java hetzelfde type afleiden. De lijst begint leeg, met grootte 0; na deze twee aanroepen bevat die [tea, milk] en heeft die grootte 2. Als je de lijst direct afdrukt, zie je de elementen: System.out.println(drinks);.

Het elementtype van een lijst moet een klassetype zijn. Gebruik voor getallen een wrapperklasse: Integer voor int, Double voor double, Boolean voor boolean of Character voor char. ArrayList<int> compileert niet. Met ArrayList<Integer> numbers = new ArrayList<>(); werkt numbers.add(5) omdat Java de int via autoboxing omzet naar een Integer. Als je de waarde leest met int n = numbers.get(0);, past Java unboxing toe.

Volg elke indexwijziging
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);

set(0, "coffee") vervangt het eerste element en geeft de oude waarde terug, dus old is "tea". De grootte blijft 2. Als je "water" op index 1 invoegt, schuift "milk" naar rechts. De lijst is nu [coffee, water, milk]; last is "milk" en de grootte is 3.

TaakAanroepGeldige index
Een element lezenget(i)0 tot en met size() - 1
Een element vervangenset(i, value)0 tot en met size() - 1
Een element invoegenadd(i, value)0 tot en met size()
Een element achteraan toevoegenadd(value)Geen index nodig

De extra toegestane invoegindex is de positie direct na het huidige laatste element. Bij deze lijst voegt add(3, "juice") achteraan toe, maar get(3) zou vóór die invoeging falen. Een ongeldige index veroorzaakt een IndexOutOfBoundsException. Gebruik get(size() - 1) voor het laatste element, nadat je hebt gecontroleerd dat de lijst niet leeg is.

Begin met gegevens of verzamel invoer

Met import java.util.List; maakt new ArrayList<>(List.of("red", "green", "blue")) een wijzigbare lijst met die waarden. List.of(...) alleen maakt een niet-wijzigbare lijst: add, set en remove werpen een UnsupportedOperationException op. Je zult ook List<String> names = new ArrayList<>(); zien; de algemene List-variabele ondersteunt deze lijstmethoden nog steeds.

Gebruik een Scanner met de naam scanner en een lege lijst met de naam lines om regels te verzamelen tot aan een lege regel:

while (true) {
    String line = scanner.nextLine();
    if (line.isEmpty()) {
        break;
    }
    lines.add(line);
}

De stopregel wordt vóór het toevoegen gecontroleerd en dus niet opgeslagen. lines.size() telt de opgeslagen regels. lines.isEmpty() test of er geen zijn en lines.clear() verwijdert ze allemaal wanneer je de lijst opnieuw wilt gebruiken.

Belangrijkste punten

  • Indexen beginnen bij 0; het laatste element staat op size() - 1.
  • set vervangt; add met een index voegt in en verschuift latere elementen.
  • Gebruik wrappertypen zoals Integer in een ArrayList.
  • Kopieer List.of(...) naar een ArrayList als de lijst moet kunnen veranderen.
  • clear() verwijdert alle elementen; een lege lijst heeft grootte 0.

1.2 Verwijder waarden en vind hun posities

Als je een element verwijdert, veranderen zowel de grootte als de indexen van latere elementen. Een zoekactie vertelt je of een waarde bestaat of waar die nu staat. Houd het verschil tussen een waarde en de positie ervan duidelijk, vooral in een lijst met gehele getallen.

Twee betekenissen van remove
AanroepBetekenisTeruggegeven resultaat
remove(int index)Verwijder het element op een positieHet verwijderde element
remove(Object value)Verwijder de eerste gelijke waardetrue indien verwijderd; anders false

Bij [coffee, water, milk] geeft remove(0) de waarde "coffee" terug en blijft [water, milk] over. De oude index 2 voor "milk" is nu ongeldig; die waarde is naar index 1 verschoven. Een opgeslagen index is alleen bruikbaar zolang bewerkingen de posities die de index aanduidt niet hebben veranderd.

Verwijderen op waarde betekent niet dat alle overeenkomsten worden verwijderd. Als je begint met [a, b, a], laat remove("a") de lijst [b, a] over. Een tweede aanroep verwijdert de resterende "a". Een ontbrekende waarde verwijderen geeft false terug en laat de lijst ongewijzigd, zodat je het resultaat direct kunt gebruiken:

boolean removed = names.remove("Lena");
if (removed) {
    System.out.println("Name removed");
}
De valkuil van de methodevarianten bij gehele getallen

Een int-argument selecteert de vorm met een index, ook als de lijst gehele getallen bevat:

ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));

De eerste aanroep verwijdert het element op index 1, dus removed is 20 en de lijst wordt [10, 30]. De tweede aanroep geeft expliciet een Integer-object mee. Die verwijdert de waarde 10, maakt found waar en laat [30] over. Een aanroep van remove(10) op de oorspronkelijke lijst met drie elementen zou index 10 proberen en een IndexOutOfBoundsException opwerpen.

Kies een zoekresultaat

Voor colors = [red, green, blue, green] is contains("green") gelijk aan true, indexOf("green") aan 1 en lastIndexOf("green") aan 3. contains geeft een ja-of-neeantwoord. De twee indexmethoden geven de eerste of laatste positie die overeenkomt. Een ontbrekende waarde levert respectievelijk false of -1 op.

Deze methoden gebruiken equals om elementen te vergelijken. De inhoud van strings moet exact overeenkomen, inclusief hoofdletters en kleine letters: indexOf("Green") is -1 voor deze lijst. Voor een hoofdletterongevoelige zoekactie kan een lus elke naam vergelijken met equalsIgnoreCase.

Een overeenkomst op index 0 is ook een overeenkomst. Met de test indexOf(x) > 0 mis je die. Als je de positie nodig hebt, test dan expliciet op de waarde die aangeeft dat er niets is gevonden:

int index = colors.indexOf("red");
if (index != -1) {
    colors.remove(index);
}

Hier geeft de zoekactie 0 terug, slaagt de test en blijft na verwijdering op index 0 de lijst [green, blue, green] over. Controleer vóór het toevoegen om dubbele namen te voorkomen: if (!names.contains(name)) { names.add(name); }. Om alle voorkomens te verwijderen, kun je de verwijdering herhalen zolang contains waar is of een veilige achterwaartse lus gebruiken. Een voorwaartse lus die na een verwijdering altijd de index verhoogt, kan een verschoven element overslaan.

Belangrijkste punten

  • remove(index) geeft een element terug; remove(value) geeft een booleaanse waarde terug.
  • Gebruik voor een gehele waarde remove(Integer.valueOf(x)).
  • Bij verwijdering schuiven latere elementen één positie naar links.
  • indexOf en lastIndexOf geven -1 terug voor een ontbrekende waarde; 0 betekent gevonden.
  • Zoekacties in strings zijn hoofdlettergevoelig en vergelijken de inhoud.
  • Verwijderen op waarde verwijdert alleen de eerste overeenkomst.

1.3 Begrijp gedeelde lijsten en kopieën

Een lijstvariabele bevat een referentie naar een object. De variabele zelf bevat niet alle elementen. Dit verklaart waarom een lijst wijzigen via de ene naam invloed kan hebben op een andere naam en waarom een parameter een waarde toewijzen een ander effect heeft dan de elementen bewerken.

Volg de referenties
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");

original en alias verwijzen naar één lijst. Na de toevoeging via alias tonen beide [tea, milk]. De kopie is een afzonderlijke lijst, die vóór die toevoeging is gemaakt, en bevat dus [tea, juice]. Twee namen voor één object heten aliassen. Een toewijzing kopieert een referentie; de kopieerconstructor maakt een nieuwe lijst en kopieert de elementen daarin.

De gekopieerde lijst bevat referenties naar dezelfde elementobjecten. Bij strings en wrapperwaarden kunnen die elementobjecten niet veranderen, dus als je een plaats in de ene lijst vervangt, verandert de plaats in de andere lijst niet. Een lijst kopiëren is voldoende om deze twee lijsten onafhankelijk te laten toevoegen, verwijderen en vervangen.

Een methode krijgt een kopie van de referentie

Java geeft argumenten door op waarde. Voor een lijst is die waarde een referentie. De variabele van de aanroeper en de parameter verwijzen aanvankelijk naar dezelfde lijst:

static void addBonus(ArrayList<Integer> scores, int bonus) {
    for (int i = 0; i < scores.size(); i++) {
        scores.set(i, scores.get(i) + bonus);
    }
}

Als je addBonus(scores, 5) aanroept op [70, 85], verandert de lijst van de aanroeper in [75, 90]. De methode hoeft geen lijst terug te geven omdat die het gedeelde object bewerkt. Maar als je binnen de methode scores = new ArrayList<>(); toewijst, laat je alleen de lokale parameter naar een andere lijst verwijzen. De variabele van de aanroeper verwijst nog steeds naar de oude lijst.

Een int-parameter ontvangt een gekopieerd getal. Als je die parameter wijzigt, kan de int-variabele van de aanroeper niet veranderen. In beide gevallen is de parameter lokaal; het verschil is of de waarde ervan naar een gedeeld veranderlijk object leidt.

Geef nieuwe gegevens terug als dat de taak is
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
    ArrayList<String> result = new ArrayList<>();
    for (String word : words) {
        if (word.length() >= minLength) {
            result.add(word);
        }
    }
    return result;
}

De methode leest words en schrijft alleen naar result, dus de invoer blijft ongewijzigd. Een methode die een argument wijzigt, moet dat gedrag duidelijk maken, zoals addBonus doet. Een methode die nieuwe gegevens teruggeeft, maakt het gemakkelijker om de uitvoer afzonderlijk van de invoer te controleren.

Vergelijk inhoud en handel ontbrekende resultaten af

a == b test of twee lijstreferenties naar hetzelfde object verwijzen. a.equals(b) test of de lijsten even groot zijn en gelijke elementen in dezelfde volgorde hebben. Twee afzonderlijk opgebouwde lijsten [1, 2] hebben gelijke inhoud maar een verschillende identiteit; [2, 1] heeft geen gelijke inhoud in de volgorde van de lijst.

Een lege lijst is een echt object met grootte 0. Een lus daarover wordt nul keer uitgevoerd, maar get(0) faalt omdat er geen elementindexen zijn. null betekent dat er geen lijstobject is; zelfs size() werpt dan een NullPointerException op. Een methode zonder overeenkomsten kan een lege resultatenlijst teruggeven, zodat de aanroeper het resultaat normaal kan doorlopen.

Belangrijkste punten

  • Door toewijzing wordt een lijst gedeeld; new ArrayList<>(original) maakt een afzonderlijke lijst.
  • Een methode kan de lijst van de aanroeper bewerken via een gekopieerde referentie.
  • Een parameter opnieuw toewijzen laat de variabele van de aanroeper niet naar een andere lijst verwijzen.
  • equals bij lijsten vergelijkt de inhoud in volgorde; == vergelijkt identiteit.
  • Een lege lijst kun je doorlopen; null verwijst naar geen enkele lijst.
2

Sla gegevens met een vast aantal elementen op in arrays

Arrays geven elke waarde een genummerde plaats in een structuur waarvan de lengte vast blijft. Maak en vul die plaatsen, lees hun standaardwaarden en druk hun inhoud duidelijk af. Voor arrays kopiëren, vergelijken, verwisselen en aan methoden doorgeven moet je begrijpen welke variabelen naar hetzelfde object verwijzen. Gebruik deze ideeën om voor een bepaalde taak een array of een ArrayList te kiezen.

2.1 Maak arrays met vaste plaatsen

Een array bewaart een vast aantal elementen van één type. Je kiest de lengte wanneer je de array maakt. Elementen kunnen veranderen, maar het aantal plaatsen in die array niet. Arrays kunnen primitieve waarden direct opslaan.

Maak en vul plaatsen
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};

new int[5] maakt vijf plaatsen. Hun indexen zijn 0, 1, 2, 3 en 4. Met vierkante haken lees en schrijf je een plaats, dus first wordt 90. De initialisator voor primes maakt en vult vijf plaatsen. Wanneer je een gevulde array als expressie nodig hebt, bijvoorbeeld als methodeargument, gebruik je new int[] {2, 3, 5}.

De lengte is een veld: scores.length, zonder haakjes. Het telt alle plaatsen, ook de plaatsen waaraan je zelf nog geen waarde hebt toegewezen. Als je een waarde op plaats 0 zet, verandert de lengte niet van 5 in 1.

StructuurAantal elementenEen element lezen
Arraya.lengtha[i]
ArrayLista.size()a.get(i)
Strings.length()s.charAt(i)

Deze namen zijn niet onderling uitwisselbaar. Een array heeft geen methode size() en een string heeft haakjes nodig na length.

Ken de beginwaarden

Nieuwe plaatsen in een array krijgen standaardwaarden. Numerieke primitieve arrays beginnen met nul: 0 voor int, 0,0 voor double. Een boolean[] begint met false; een char[] begint met het teken waarvan de code nul is, geschreven als '\u0000'. Arrays van klassetypen, waaronder String[], beginnen met null-referenties.

String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());

Dit drukt 3 af omdat plaats 0 nu naar "sun" verwijst. Plaatsen 1 en 2 bevatten nog steeds null. De aanroep words[1].length() werpt een NullPointerException op: er staat daar nog geen string. Een plaats met de standaardwaarde null is iets anders dan een lege string "", een object met lengte 0.

Lees uitvoer en blijf binnen de array

Importeer java.util.Arrays en gebruik System.out.println(Arrays.toString(scores)); om [90, 0, 0, 0, 0] af te drukken. Als je scores direct afdrukt, zie je een type- en identiteitscode zoals [I@1b6d3586, niet de elementen. De identiteitscode geeft geen bruikbaar overzicht van de opgeslagen getallen.

Voor één week met temperaturen in graden Celsius:

double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;

De meting van de derde dag verandert van 9,5 in 10,0. De eerste meting is temps[0]; de laatste is temps[6], of temps[temps.length - 1]. temps[7] ligt buiten de array. Java werpt een ArrayIndexOutOfBoundsException op bij een ongeldige arrayindex. Gebruik in een lus met index i < temps.length: i <= temps.length probeert één extra plaats na de laatste geldige plaats. Een array met lengte nul heeft helemaal geen geldige elementindexen.

Belangrijkste punten

  • De lengte van een array ligt vast wanneer de array wordt gemaakt.
  • Gebruik a[i] om een plaats te lezen of te schrijven en a.length om plaatsen te tellen.
  • Nieuwe numerieke plaatsen bevatten nul; nieuwe String-plaatsen bevatten null.
  • Arrays.toString(a) drukt de inhoud af.
  • De laatste geldige index is a.length - 1.

2.2 Kopieer en vergelijk arrays en verwissel elementen

Een arrayvariabele bevat een referentie, net als een lijstvariabele. Als je die referentie toewijst, maak je een andere naam voor dezelfde array. Voor een afzonderlijke kopie is een nieuw arrayobject nodig en om de inhoud te vergelijken is een methode nodig die de plaatsen controleert.

Toewijzen en kopiëren
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;

Nu tonen a en alias allebei [99, 9, 2]; copy toont nog steeds [4, 9, 2]. Arrays.copyOf(a, a.length) maakt een nieuwe array met dezelfde lengte. Ook met a.clone() kun je de array kopiëren. Importeer java.util.Arrays voor de hulpmethoden.

Een andere gevraagde lengte verandert de nieuwe array, niet de oude. Arrays.copyOf(new int[] {2, 3, 5}, 4) levert [2, 3, 5, 0] op. Extra plaatsen krijgen standaardwaarden. Om een variabele naar een grotere array te laten verwijzen, wijs je de teruggegeven kopie aan die variabele toe. Een alias van het origineel verwijst nog steeds naar de oude array.

Methodeaanroepen delen het object
static void doubleAll(int[] values) {
    for (int i = 0; i < values.length; i++) {
        values[i] = values[i] * 2;
    }
}

De parameter ontvangt een kopie van de referentie. De methode verandert daardoor de plaatsen in de array van de aanroeper. Als je values opnieuw aan een nieuwe array zou toewijzen, zou alleen de parameter veranderen. Een methode kan ook een nieuwe array teruggeven: return new int[] {values[0], values[values.length - 1]}; levert [4, 2] op voor invoer {4, 9, 2}. Die expressie vereist niet-lege invoer omdat die twee indexen leest.

Inhoudelijke gelijkheid werkt anders bij arrays

Voor afzonderlijk gemaakte arrays a = {1, 2} en b = {1, 2} zijn zowel a == b als a.equals(b) onwaar: equals bij arrays controleert identiteit. Arrays.equals(a, b) is waar omdat de overeenkomstige elementen gelijk zijn. Dit verschilt van een ArrayList, waarvan equals de inhoud in volgorde vergelijkt.

Bewaar een waarde voordat je die overschrijft

Om twee posities te verwisselen, bewaar je één oude waarde in een tijdelijke variabele:

int temp = a[0];
a[0] = a[2];
a[2] = temp;

Als je begint met {4, 9, 2}, bewaart de eerste regel 4. De tweede levert [2, 9, 2] op. De derde zet de opgeslagen 4 terug op index 2 en voltooit zo [2, 9, 4]. Zonder temp zou de toewijzing a[2] = a[0] na de tweede regel opnieuw 2 kopiëren en zou de oorspronkelijke 4 verloren gaan.

Kies een structuur die bij de gegevens past
BehoefteGeschikte keuze
Een vaste plaats voor elke dag of maandArray
Primitieve waarden zonder wrappersArray
Elementen toevoegen of verwijderen zodra invoer binnenkomtArrayList

Arrays komen ook voor in main(String[] args) en als resultaat van String.split. Voor een String[] words maakt new ArrayList<>(Arrays.asList(words)) een lijst die kan groeien. Maak voor een int[] een ArrayList<Integer> en voeg elk geheel getal toe in een lus. Arrays.asList behandelt de volledige primitieve array als één element en maakt dus geen lijst van de afzonderlijke getallen.

Belangrijkste punten

  • Een array toewijzen deelt hetzelfde object; copyOf of clone maakt een kopie.
  • Gebruik Arrays.equals voor de inhoud van arrays.
  • Een methode kan via haar parameter gedeelde plaatsen in een array wijzigen.
  • Een tijdelijke variabele bewaart een waarde tijdens het verwisselen.
  • Gebruik arrays voor vaste plaatsen en ArrayLists voor veranderlijke aantallen.
  • Zet een primitieve array met een lus om naar een lijst met wrappers.
3

Verwerk lijsten en arrays met lussen

Lussen zetten opgeslagen waarden om in bruikbare resultaten: een totaal, een aantal, een extremum, een gefilterde collectie of een zoekresultaat. Kies hoe je elementen bezoekt op basis van de vraag of je waarden of posities nodig hebt. Volg hoe de toestand van elke lus verandert om lege gegevens af te handelen, het deel achter de komma bij gemiddelden te behouden, een zoekactie op tijd te stoppen en waarden te verwijderen zonder verschuivende elementen te missen.

3.1 Kies een lus met index of een for-each-lus

Met een lus kan één stuk code elk element verwerken. De keuze hangt af van wat de lusbody nodig heeft: alleen een waarde, de positie ervan of een manier om naar de collectie terug te schrijven. Zowel arrays als ArrayLists ondersteunen lussen met index en for-each-lussen.

Bezoek waarden op volgorde
for (String task : tasks) {
    System.out.println(task);
}

Lees dit als “voor elke taak in tasks”. Bij [shop, cook, clean] drukt de lus de drie strings in die volgorde af. De lusvariabele heeft het elementtype. Gebruik bij ArrayList<Integer> het type int om op elke waarde unboxing toe te passen of Integer om de wrapperreferentie te behouden. Voor tekens van een string bezoekt for (char c : word.toCharArray()) de char-waarden.

Een for-each-lus biedt geen index. Gebruik een lus met index als je genummerde regels nodig hebt:

for (int i = 0; i < tasks.size(); i++) {
    System.out.println((i + 1) + ". " + tasks.get(i));
}

De index begint bij 0, maar het weergegeven regelnummer begint bij 1. Door de haakjes is i + 1 een optelling voordat het resultaat deel van de tekst wordt. Voor een array verander je de voorwaarde in i < tasks.length en lees je tasks[i]. Een while-lus kan hetzelfde doen door vóór de lus een teller te initialiseren en die in de lusbody te verhogen.

Schrijf terug via een positie
int[] nums = {4, 9, 2};
for (int n : nums) {
    n = n * 2;
}

Dit laat de array ongewijzigd. Elke iteratie zet een kopie van één primitieve waarde in n; een waarde toewijzen aan die lokale variabele schrijft niet naar de oorspronkelijke plaats. Om de array te wijzigen:

for (int i = 0; i < nums.length; i++) {
    nums[i] = nums[i] * 2;
}

Het resultaat is [8, 18, 4]. Voor een lijst met gehele getallen is de overeenkomstige bijwerking list.set(i, list.get(i) * 2). De index vertelt Java welk opgeslagen element moet worden vervangen.

Laat de grenzen bij de lusbody passen

Om een lijst achterwaarts te doorlopen, begin je bij tasks.size() - 1, ga je door zolang i >= 0 en gebruik je i--. Dit bezoekt achtereenvolgens clean, cook en shop. Om elk tweede element te nemen, kun je i += 2 in een voorwaartse lus gebruiken.

Vergelijkingen met een buur hebben een korter bereik nodig. Als de lusbody zowel list.get(i) als list.get(i + 1) leest, is de voorwaarde i < list.size() - 1. De laatste geldige beginpositie is het voorlaatste element. Met de gebruikelijke voorwaarde voor het volledig doorlopen zou de lus na het laatste element een niet-bestaande buur proberen te lezen.

Als je twee even lange lijsten samen verwerkt, gebruik je één index om beide te benaderen. Zo duiden names.get(i) en scores.get(i) de overeenkomstige elementen aan. Een for-each-lus is eenvoudiger als de positie geen rol speelt, bijvoorbeeld als je elke naam afdrukt of elke waarde bij een totaal optelt.

Als je bij 1 begint, sla je ongemerkt het eerste element over. Met <= size() of <= length probeer je één extra ongeldige index. Een lege lijst of array heeft geen speciale regel voor het doorlopen nodig: de beginvoorwaarde is onwaar, dus de lusbody wordt nul keer uitgevoerd. Latere code die door het aantal deelt of een element leest, moet het lege geval zelf afhandelen.

Belangrijkste punten

  • For-each is handig als de lusbody alleen elke waarde nodig heeft.
  • Gebruik een index om opgeslagen waarden te schrijven, posities bij te houden of buren te vergelijken.
  • Een waarde toewijzen aan een for-each-variabele vervangt geen array- of lijstelement.
  • Een buur benaderen op i + 1 vereist i < size() - 1.
  • Bij lege collecties wordt een gewone doorlooplus nul keer uitgevoerd.

3.2 Bereken een resultaat uit veel elementen

Een accumulator houdt een resultaat bij dat tijdens de iteraties van een lus wordt opgebouwd. Initialiseer de accumulator vóór de lus, werk die daarbinnen bij en gebruik die daarna. De beginwaarde hangt af van de taak: een som of telling begint bij 0, terwijl een maximum een werkelijk element nodig heeft.

Totalen en gemiddelden
int sum = 0;
for (int value : numbers) {
    sum += value;
}
if (!numbers.isEmpty()) {
    double average = (double) sum / numbers.size();
    System.out.println(average);
}

Voor [4, 7, 8] verandert sum van 0 naar 4, dan 11 en dan 19. Beide operanden in sum / numbers.size() zouden gehele getallen zijn, wat 6 oplevert. Als je sum vóór de deling expliciet converteert, krijg je ongeveer 6,33. Als je het al berekende quotiënt converteert, zet je alleen de afgekaptе waarde 6 om in 6,0.

Een lege collectie heeft geen gewoon gemiddelde. Geheeltallige deling door nul werpt een ArithmeticException op; de zwevendekommagetallendeling 0.0 / 0 geeft NaN. Bepaal vóór het delen wat het lege geval voor het programma betekent, bijvoorbeeld de melding “Geen metingen” weergeven. Voor kommagetalafstanden [5.0, 7.5, 10.0] km is een double-totaal 22,5 km en het gemiddelde 7,5 km.

Tel alleen overeenkomsten

Een voorwaardelijke telling begint bij 0 en neemt alleen toe als de test slaagt. Voor temperaturen {22, 27, 31, 24, 26} graden Celsius levert if (t > 25) { count++; } de waarde 3 op. Zet de initialisatie buiten de lus; als je count bij elke iteratie opnieuw instelt, gaan eerdere overeenkomsten verloren.

Zoek een extremum en de positie ervan

Begin bij een niet-lege array met int max = values[0];. Vervang max telkens als een bezochte waarde groter is. Beginnen bij 0 gaat fout bij {-5, -2, -9}: het resultaat is dan 0, hoewel geen element die waarde heeft. Als je begint met -5, kan de lus het juiste maximum -2 vinden. Een minimum gebruikt hetzelfde patroon met <.

Als de positie ertoe doet, houd je de beste index bij:

int best = 0;
for (int i = 1; i < numbers.size(); i++) {
    if (numbers.get(i) > numbers.get(best)) {
        best = i;
    }
}

Voor [4, 7, 8] eindigt best op 2 en is numbers.get(best) gelijk aan 8. De lus begint bij 1 omdat index 0 al de eerste kandidaat is. Met > vervangt een gelijke waarde de huidige kandidaat niet, zodat het eerste maximum behouden blijft. Met >= vervangt elke gelijke waarde de kandidaat, zodat het laatste maximum behouden blijft. Controleer of de collectie leeg is voordat je een kandidaat op index 0 kiest.

Verzamel overeenkomende waarden

Bij filteren gebruik je een lege resultatenlijst als accumulator. Bezoek elk woord, voeg het toe als word.length() > 4 en geef het resultaat terug. Voor [sun, planet, moon, galaxy] is het resultaat [planet, galaxy]. Als je de invoer leest en aan een afzonderlijke lijst toevoegt, blijft de invoer ongewijzigd.

Voor twee Integer-elementen vergelijkt == de objectidentiteit. Kleine waarden die worden hergebruikt kunnen deze fout verbergen; gelijke grotere waarden kunnen verschillende objecten zijn. Vergelijk met equals of pas eerst unboxing toe naar int-variabelen. De numerieke operatoren <, >, <= en >= passen unboxing toe op wrapperwaarden, dus de code voor de beste index vergelijkt hun getallen.

Belangrijkste punten

  • Initialiseer een accumulator vóór de lus en werk die daarbinnen bij.
  • Converteer vóór een geheeltallige deling om het deel achter de komma van een gemiddelde te behouden.
  • Controleer of de collectie leeg is voordat je een gemiddelde of extremum bepaalt.
  • Initialiseer een maximum of minimum met een werkelijk element.
  • > behoudt het eerste maximum; >= behoudt het laatste.
  • Bij filteren verzamel je overeenkomsten in een nieuwe lijst.
  • Gebruik waardegelijkheid voor twee Integer-objecten.

3.3 Zoek tot een overeenkomst of het einde

Een lineaire zoekactie controleert elementen één voor één. Die werkt op gegevens in elke volgorde. Een succesvolle zoekactie naar de eerste overeenkomst kan vroeg stoppen; een zoekactie zonder resultaat moet het einde bereiken voordat vaststaat dat geen element overeenkomt.

Geef de eerste overeenkomende index terug
static int indexOfName(ArrayList<String> names, String target) {
    for (int i = 0; i < names.size(); i++) {
        if (names.get(i).equals(target)) {
            return i;
        }
    }
    return -1;
}

Als de eerste overeenkomende naam op index 2 staat, controleert de methode indexen 0, 1 en 2 en geeft dan direct 2 terug. De return -1 staat na de lus omdat pas na een volledige doorloop vaststaat dat er geen overeenkomst is. Als je else { return -1; } binnen de lus zet, stopt de methode bij het eerste element dat niet overeenkomt en negeert die alle latere kandidaten.

De waarde -1 die aangeeft dat iets ontbreekt, kan geen geldige index zijn. De aanroeper moet die controleren voordat het resultaat wordt gelezen:

int index = indexOfName(names, "Ahmed");
if (index != -1) {
    System.out.println(names.get(index));
}

De test index > 0 zou een geldige overeenkomst op index 0 missen. Als je -1 direct in get gebruikt, wordt een exceptie opgeworpen. Bij een lege lijst wordt de lusbody nooit uitgevoerd en geeft de methode terecht -1 terug.

Pas de vergelijking aan de taak aan

Voor exacte waarden in een lijst voeren contains en indexOf al een lineaire zoekactie uit. Schrijf een lus voor een array of een voorwaarde zoals “begint met L”. Gebruik equals of equalsIgnoreCase voor strings, == voor primitieve waarden en equals voor twee Integer-objecten. Een identiteitstest voor strings kan gelijke tekst missen.

Test voor String[] cities = {"Oslo", "Lima", "Lagos", "Pune"} de voorwaarde cities[i].startsWith("L"). Index 0 voldoet niet; index 1 voldoet wel, dus het resultaat voor de eerste overeenkomst is 1. Als de taak om alle overeenkomsten vraagt, keer je daar niet terug. Voeg overeenkomende indexen toe aan een resultatenlijst en voltooi de doorloop; dat geeft [1, 2]. Om overeenkomsten te tellen, verhoog je een teller in plaats van posities op te slaan.

Kies de vorm van het antwoord

Een ja-of-neezoekactie kan beginnen met boolean found = false;. Zet de waarde bij een overeenkomst op waar en verlaat de lus met break. Zonder die break blijft het eindantwoord waar, maar controleert het programma waarden die het niet meer nodig heeft. Een zoekmethode kan ook direct true teruggeven en na de lus false teruggeven.

Als je een element teruggeeft, is een afzonderlijk resultaat voor “niets gevonden” nodig. Voor een String is dit vaak null; de aanroeper moet daarop controleren voordat die een String-methode aanroept. Als je een index met -1 teruggeeft, is het ontbrekende geval zichtbaar zonder te stellen dat een lege string ontbrekende gegevens zijn.

Tel het werk dat de zoekactie werkelijk doet

Een doelwaarde op de eerste positie vereist één vergelijking. Een doelwaarde op de derde positie vereist er drie. Een ontbrekende doelwaarde in 10.000 namen vereist alle 10.000 vergelijkingen. De eerste mislukte vergelijking kan niet vaststellen dat de doelwaarde ook op de resterende posities ontbreekt. Een zoekactie naar alle overeenkomsten controleert eveneens elk element, ook na een vroege overeenkomst, omdat latere waarden ook kunnen overeenkomen.

Belangrijkste punten

  • Lineair zoeken bezoekt elementen op volgorde en werkt bij elke invoervolgorde.
  • Geef bij de eerste overeenkomst een index terug; geef -1 pas na de lus terug.
  • Gebruik de vergelijking die bij het elementtype past.
  • Zoekacties naar alle overeenkomsten gaan na een overeenkomst door met zoeken.
  • Controleer op de waarde voor een ontbrekend resultaat voordat je het zoekresultaat gebruikt.

3.4 Verwijder elementen zonder ze over te slaan

Als je elementen uit een ArrayList verwijdert, veranderen de posities die een lus probeert te bezoeken. Het veilige patroon hangt af van de vraag of je de oorspronkelijke lijst wilt wijzigen of een afzonderlijk resultaat wilt opbouwen. Waarden vervangen is eenvoudiger omdat de posities daarbij gelijk blijven.

Bekijk hoe een voorwaartse lus een waarde overslaat

Stel dat een lus even getallen uit [3, 8, 8, 5] verwijdert en i altijd verhoogt. Op index 1 verwijdert de lus de eerste 8. De tweede 8 schuift naar index 1, maar de volgende iteratie gebruikt index 2. Het resultaat is [3, 8, 5], met één even getal over. De voorwaarde was correct; het ging mis door de verschuiving na de verwijdering.

Ook in een for-each-lus over een ArrayList mag je niet via de lijst toevoegen of verwijderen. De lus gebruikt een iterator waarvan de voortgang niet meer overeenkomt met de bewerkte lijst. Java meldt meestal een ConcurrentModificationException. Sommige bewerkingen kunnen de lus in plaats daarvan stilzwijgend beëindigen, waardoor een element niet wordt bezocht. Het ontbreken van een exceptie maakt die bewerking niet veilig.

Verwijder achterwaarts om ongecontroleerde posities stabiel te houden
for (int i = numbers.size() - 1; i >= 0; i--) {
    if (numbers.get(i) % 2 == 0) {
        numbers.remove(i);
    }
}

Bij [3, 8, 8, 5] bevat index 3 de waarde 5 en die blijft staan. Index 2 bevat 8 en wordt verwijderd. Index 1 bevat nog steeds de andere 8 en die wordt daarna verwijderd. Index 0 bevat 3 en die blijft staan. Het resultaat is [3, 5]. Een verwijdering verschuift elementen rechts van de huidige index, die deze achterwaartse lus al heeft gecontroleerd.

Bouw een lijst op met de waarden die je wilt behouden

Als het origineel ongewijzigd moet blijven, maak je een nieuwe lijst:

ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
    if (value % 2 != 0) {
        odds.add(value);
    }
}

Deze for-each-lus is veilig omdat die numbers leest en aan een andere lijst toevoegt. Met [3, 8, 8, 5] als invoer bevat odds de waarden [3, 5] en bevat de invoer nog steeds alle vier waarden. Ook een array kan niet krimpen; om de waarden daarvan te filteren is eveneens een nieuwe array of lijst nodig.

Laat een iterator zelf verwijderen
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
    if (it.next() % 2 == 0) {
        it.remove();
    }
}

Importeer java.util.Iterator. next() levert het volgende element en it.remove() verwijdert het zojuist teruggegeven element terwijl de positie van de iterator consistent blijft. Gebruik in deze lus niet numbers.remove(...) in plaats daarvan.

Een voorwaartse while-lus kan ook werken door de index alleen te verhogen als er niets is verwijderd. Na een verwijdering moet de lus dezelfde index opnieuw controleren, waar het volgende element terecht is gekomen. Dit vereist meer aandacht dan een achterwaartse lus of een nieuwe resultatenlijst.

Vervangen en toevoegen hebben verschillende effecten

set(i, value) is veilig in een lus met index omdat de grootte en posities niet veranderen. Als je bij elke iteratie toevoegt terwijl je i < list.size() test, kan het einde steeds verder opschuiven en kan de lus oneindig doorgaan. Sla int originalSize = list.size(); op en laat de lus alleen tot die grens lopen wanneer elk oorspronkelijk element tot één toegevoegde waarde moet leiden.

Belangrijkste punten

  • Voorwaarts verwijderen gevolgd door i++ slaat het element over dat naar de vrijgekomen plaats is verschoven.
  • Met een achterwaartse lus kun je veilig op index verwijderen.
  • Filteren naar een andere lijst laat het origineel ongewijzigd.
  • Gebruik tijdens het doorlopen met een iterator de eigen methode remove van de iterator.
  • Tijdens het doorlopen met for-each mag je niet via de bronlijst toevoegen of verwijderen.
  • Begrens lussen die achteraan toevoegen met de oorspronkelijke grootte als je alleen oorspronkelijke elementen verwerkt.
4

Werk met tekst met behulp van String-methoden

Tekst komt binnen als tekens, maar een programma heeft vaak namen, getallen of geselecteerde delen van een regel nodig. Lees posities met String-methoden, zoek een scheidingsteken voordat je tekst uitsnijdt en zet gescheiden velden om in waarden waarmee je kunt rekenen. Houd de teruggegeven resultaten bij: strings zijn onveranderlijk en een string opschonen helpt latere code alleen als die de opgeschoonde tekst gebruikt.

4.1 Lees tekens en bewaar String-resultaten

Een String bewaart tekst als een reeks char-waarden. Indexen beginnen bij 0, net als bij arrays en lijsten. Een String-object kan na het maken niet veranderen, dus methoden die gewijzigde tekst opleveren geven een resultaat terug dat je moet bewaren.

Een teken verschilt van een string

"Hello".length() is 5. "Hello".charAt(0) is 'H' en charAt(4) is 'o'. Een char gebruikt enkele aanhalingstekens en bevat één UTF-16-code-eenheid; een String gebruikt dubbele aanhalingstekens en kan nul, één of veel van die eenheden bevatten. "Java".charAt(0) == 'J' vergelijkt twee primitieve tekens. Die char vergelijken met "J" compileert niet omdat de typen verschillen.

charAt(length()) ligt voorbij het einde en werpt een StringIndexOutOfBoundsException op. Zelfs charAt(0) faalt bij "". Controleer isEmpty() voordat je het eerste teken van invoer leest.

length() telt UTF-16-char-waarden, die niet altijd volledige weergegeven symbolen zijn. "café".length() is 4; "Hi 👋".length() is 5 omdat de zwaaiende hand als emoji twee char-posities inneemt. Gebruik dat aantal wanneer je de indexen van deze methoden bepaalt.

Bezoek en test de tekens
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if ("aeiou".indexOf(c) >= 0) {
        vowels++;
    }
}

Door de omzetting naar kleine letters herkent dezelfde lidmaatschapstest zowel hoofdletters als kleine letters onder de klinkers. Elke indexOf(c) is niet-negatief als het teken in "aeiou" voorkomt. De telling komt uit op 6: o, a, i, i, a, a. Met for (char c : text.toCharArray()) kun je dezelfde waarden zonder index bezoeken.

De klasse Character biedt tests zoals isLetter, isDigit, isWhitespace en isUpperCase. Character.isDigit('7') is waar, terwijl Character.isLetter('7') onwaar is. Character.toUpperCase(c) en toLowerCase(c) geven geconverteerde char-waarden terug.

Tekens hebben ook getalcodes. 'a' + 1 levert de int 98 op; (char) ('a' + 1) zet die code om naar 'b'. Bij een ASCII-cijferteken geeft aftrekken van '0' de waarde: '7' - '0' is 7. De code voor nul aftrekken werkt omdat die cijfercodes opeenvolgend zijn.

Lees concatenatie van links naar rechts
ExpressieResultaat
"Total: " + 3 + 4"Total: 34"
3 + 4 + " items""7 items"
"Total: " + (3 + 4)"Total: 7"

Zodra de linkerkant van + tekst is, wordt het volgende getal als tekst samengevoegd. Haakjes dwingen de numerieke optelling vóór het samenvoegen af. Enkele samenvoegingen in één expressie zijn een duidelijke toepassing van +.

Sla de teruggegeven tekst op
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();

De afdruk toont nog steeds "Lena": de weggegooide aanroep heeft het object niet veranderd. Door de toewijzing verwijst name daarna naar "LENA". Onveranderlijkheid van strings betekent dat de oude tekst ongewijzigd blijft, ook als andere variabelen ernaar verwijzen. Het resultaat bewaren en het oorspronkelijke object veranderen zijn verschillende bewerkingen.

Belangrijkste punten

  • charAt(i) geeft een char terug; geldige indexen eindigen bij length() - 1.
  • Chars gebruiken enkele aanhalingstekens; strings gebruiken dubbele aanhalingstekens.
  • De lengte van een string telt UTF-16-charwaarden, dus sommige symbolen nemen twee posities in.
  • Character-methoden testen en converteren afzonderlijke char-waarden.
  • Strings samenvoegen met + gebeurt van links naar rechts.
  • Sla het resultaat van een String-transformatie op.

4.2 Zoek delen van tekst en haal die eruit

Tekstverwerking volgt vaak een korte reeks stappen: zoek een markering, controleer of die bestaat en haal daarna het benodigde deel eruit. Opschoonbewerkingen kunnen de tekst voorbereiden op een zoekactie of vergelijking. Elke String-bewerking geeft een resultaat terug zonder het oorspronkelijke object te veranderen.

Zoek posities of stel een ja-of-neevraag

Voor "banana" geeft indexOf('a') de waarde 1 terug, indexOf("a", 2) de waarde 3 en lastIndexOf('a') de waarde 5. Het tweede argument bepaalt waar de voorwaartse zoekactie begint. Een zoekactie zonder resultaat geeft -1, zoals in indexOf("x").

Gebruik contains(text) als je alleen hoeft te weten of tekst voorkomt. startsWith(prefix) controleert het begin en endsWith(suffix) het einde. "report.pdf".endsWith(".pdf") is waar. Deze zoekacties zijn hoofdlettergevoelig: "Hello".contains("hello") is onwaar. De indexmethoden accepteren een char of een String; contains neemt tekst als argument.

Een deelstring eindigt vlak vóór de eindindex
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);

middle is "gram" en gebruikt de posities 3, 4, 5 en 6. De lengte is 7 - 3, oftewel 4. tail is "gramming", omdat de methode tot het einde van de string loopt als je het eindargument weglaat. De beginindex moet niet-negatief zijn en mag niet groter zijn dan de eindindex; de eindindex mag niet groter zijn dan length(). Ongeldige grenzen werpen een StringIndexOutOfBoundsException op.

Zoek bij een e-mailadres het scheidingsteken voordat je de delen eruit haalt:

String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
    String user = email.substring(0, at);
    String domain = email.substring(at + 1);
}

Het scheidingsteken staat op index 8. Het eerste deel eindigt ervoor en geeft "lena.ito"; het tweede begint erna en geeft "example.com". Als de markering ontbreekt, is at gelijk aan -1. Een aanroep van substring(0, at) zonder de controle zou falen. Als je het tweede deel bij at zou laten beginnen, zou de @ in het domein blijven staan.

Schoon alleen op waarop de bewerking gericht is
MethodeEffect
toUpperCase() / toLowerCase()Geeft tekst terug met omgezette hoofdletters of kleine letters
trim()Verwijdert aan het begin en einde tekens met codes tot en met U+0020
strip()Verwijdert aan het begin en einde witruimte die Character.isWhitespace herkent
replace(target, replacement)Vervangt elk letterlijk voorkomen
repeat(n)Voegt n kopieën van de tekst samen

" hello ".trim() geeft "hello"; spaties binnen de tekst blijven staan. strip() verwerkt extra Unicode-witruimte, zoals een em-spatie. De methode gebruikt de Java-definitie van witruimte, die niet elk teken omvat dat op een spatie lijkt. "banana".replace('a', 'o') geeft "bonono". "ab".repeat(3) geeft "ababab".

Leeg en alleen witruimte zijn verschillend

isEmpty() test op lengte 0. isBlank() accepteert ook tekst die alleen uit Java-witruimte bestaat. Voor " " is de eerste onwaar en de tweede waar. Gebruik de test die bij de invoerregel past. Om een antwoord zoals " Yes " op te schonen, geeft answer.trim().toLowerCase() de waarde "yes" terug. Sla die teruggegeven tekst op als de variabele de opgeschoonde waarde moet bewaren; een losse answer.trim(); gooit die weg.

Belangrijkste punten

  • Zoekacties naar posities geven -1 terug als een markering ontbreekt.
  • substring(begin, end) omvat begin en sluit end uit.
  • Controleer een gevonden positie voordat je die als grens voor een deelstring gebruikt.
  • replace vervangt letterlijke tekst; trim en strip werken aan de uiteinden.
  • isBlank accepteert tekst met alleen witruimte, terwijl isEmpty lengte 0 vereist.

4.3 Zet een tekstregel om in bruikbare velden

Een gegevensregel kan meerdere waarden bevatten die door een komma of een andere markering zijn gescheiden. Splitsen levert een array met strings op; parsen zet daarna geselecteerde velden om naar getallen. Controleer de vorm van de gegevens voordat je posities gebruikt.

Splits naar een array
String[] fields = "Ada,36,London".split(",");

Er zijn drie velden: "Ada", "36" en "London". De komma’s blijven niet behouden. fields.length is 3 en fields[1] is nog steeds tekst, geen getal.

Het scheidingsteken dat aan split wordt doorgegeven, is een reguliere expressie, een patroon dat niet altijd letterlijke tekst is. Een komma betekent zichzelf, maar ., |, *, + en ? hebben een speciale betekenis. Gebruik "1.5.2".split("\\.") om een versiestring bij letterlijke punten te splitsen. Twee backslashes in de Java-string leveren de ene backslash in het patroon op die de punt letterlijk maakt. split(".") komt daarentegen overeen met afzonderlijke tekens en levert voor dit voorbeeld een lege array op.

Handel spaties en lege delen af

Als je "a b" splitst bij " ", krijg je drie delen: "a", "" en "b". Elk scheidingsteken is één spatie, dus opeenvolgende spaties laten een leeg deel ertussen over. Gebruik voor reeksen witruimte:

String[] words = "  red   green blue ".trim().split("\\s+");

Het resultaat is [red, green, blue]. Door eerst trim te gebruiken, voorkom je een leeg eerste deel door een scheidingsteken aan het begin. Standaard laat split lege delen aan het einde weg: "a,b,,".split(",") levert alleen "a" en "b" op. Tel de werkelijke resulterende velden voordat je ze met een index benadert.

Parse elk veld naar het bedoelde type

Integer.parseInt("42") geeft de primitieve int 42 terug. Integer.valueOf("-7") geeft een Integer-object terug. Double.parseDouble("5.2") geeft 5,2 terug en gebruikt een punt als decimaalteken, ongeacht de landinstellingen van de computer. Bij het parsen van gehele getallen moet de tekst een geheel getal zonder decimaalpunt bevatten. Integer.parseInt("4.5") faalt in plaats van af te ronden.

Gebruik trim op velden voordat je ze parset, vooral bij tekst met gehele getallen: Integer.parseInt(" 42") werpt een NumberFormatException op. Splitsen bij komma’s verwijdert geen spaties rond de velden. Een correct aantal velden garandeert ook niet dat een veld een geldig getal bevat.

Lees een volledig record
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
    String name = parts[0].trim();
    double distanceKm = Double.parseDouble(parts[1].trim());
    int minutes = Integer.parseInt(parts[2].trim());
    double pace = minutes / distanceKm;
    System.out.println(name + ": " + pace + " min/km");
}

De afstand is 10,5 km, de tijd is 63 minuten en het tempo is 6,0 min/km. De onvolledige regel "Amira,10.5" heeft slechts twee velden; zonder controle van het aantal zou parts[2] een ArrayIndexOutOfBoundsException opwerpen. Een programma kan dat onvolledige record overslaan of melden voordat het een ontbrekende positie gebruikt.

Zet weer om naar tekst of voeg tekst samen

String.valueOf(42) en Integer.toString(42) geven beide "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) geeft "Oslo, Lima, Pune" en voegt alleen tussen de delen scheidingstekens in. De methode accepteert een lijst, een array of afzonderlijke stringargumenten. Samenvoegen parset of berekent niets: het combineert de aangeleverde strings.

Belangrijkste punten

  • split geeft een String-array terug en behandelt het scheidingsteken als een patroon.
  • Escape een letterlijke punt als "\." in Java-code.
  • Gebruik trim voordat je bij reeksen witruimte splitst en voordat je velden met gehele getallen parset.
  • Standaard laat split lege velden aan het einde weg.
  • Controleer het aantal velden en de numerieke tekst voordat je geparste gegevens gebruikt.
  • Gebruik String.join voor tekstdelen en parseermethoden voor getallen.
5

Vergelijk strings correct en bouw tekst efficiënt op

Tekst die er gelijk uitziet, kan bij verschillende String-objecten horen. Kies een vergelijking die bij de taak past: inhoudelijke gelijkheid, gelijkheid zonder onderscheid tussen hoofdletters en kleine letters, of de tekenvolgorde van Java. Bouw en bewerk daarna grotere stukken tekst met StringBuilder. Als je zowel referenties als teruggegeven waarden volgt, kun je voorspellen of een bewerking bestaande tekst verandert, een resultaat maakt of alleen twee objecten vergelijkt.

5.1 Vergelijk de inhoud en volgorde van strings

Twee variabelen kunnen tekst met dezelfde tekens bevatten zonder naar hetzelfde String-object te verwijzen. Kies een vergelijking op basis van de vraag: gelijke inhoud, gelijke inhoud zonder onderscheid tussen hoofdletters en kleine letters, of welke tekst eerst komt in de volgorde van Java.

Gebruik equals voor inhoud
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));

Het eerste resultaat is onwaar: het afzonderlijk gemaakte object is niet het object van de literal. Het tweede is waar omdat de tekens overeenkomen. Identieke literals zoals "yes" == "yes" delen een object en kunnen een identiteitsvergelijking betrouwbaar laten lijken. Tekst die tijdens de uitvoering ontstaat, kan nieuwe of bestaande objecten gebruiken, dus identiteit is geen test om te bepalen of invoer overeenkomt.

equalsIgnoreCase negeert het verschil tussen hoofdletters en kleine letters: "YES".equalsIgnoreCase("yes") is waar. De methode verwijdert geen spaties. Om ook spaties rondom te accepteren, schoon je de invoer vóór het vergelijken op.

Roep bij een variabele die null kan zijn de methode aan op een bekende literal die niet null is: "yes".equals(answer) geeft onwaar terug bij null. answer.equals("yes") werpt een NullPointerException op als answer null is, omdat er geen object is dat de aanroep ontvangt.

Een opdrachtlus kan !command.equals("quit") testen. De ! ontkent de inhoudelijke gelijkheid. command != "quit" test daarentegen referenties en kan een lus laten doorgaan, zelfs als de getypte tekens “quit” vormen.

Interpreteer het teken van compareTo

a.compareTo(b) vergelijkt UTF-16-charwaarden één voor één. De methode geeft een negatief getal terug als a vóór b komt, nul als ze gelijk zijn en een positief getal als de eerste erna komt. Alleen het teken is van belang voor de volgorde; een resultaat hoeft niet precies -1 of 1 te zijn.

VergelijkingTekenReden
"apple".compareTo("banana")NegatiefEerste verschillende char komt eerder
"pear".compareTo("pear")NulAlle tekens komen overeen
"car".compareTo("carpet")NegatiefGelijk begin, kortere string eerst
"10".compareTo("9")Negatief'1' komt vóór '9'

Getallen die als tekst zijn opgeslagen, volgen dus niet de numerieke volgorde. Parse ze als de taak numeriek is. Engelse hoofdletters zonder accent komen vóór kleine letters zonder accent, dus "Zebra" komt vóór "apple". In deze volgorde komt "Émile" met accent na "Zoe". compareToIgnoreCase negeert hoofdletters en kleine letters; voor woordenboekvolgorde volgens een specifieke taal is java.text.Collator nodig.

Gebruik het minimumpatroon opnieuw voor namen

Voor een niet-lege lijst [Mia, Ahmed, Lucia]:

String first = names.get(0);
for (String name : names) {
    if (name.compareTo(first) < 0) {
        first = name;
    }
}

"Mia" is de eerste kandidaat. "Ahmed" komt daarvoor en wordt de kandidaat; "Lucia" vervangt die niet. Het resultaat is "Ahmed". Controleer of de lijst leeg is voordat je het eerste element leest.

Een afzonderlijke char is primitief, dus word.charAt(0) == 'A' is een correcte tekenvergelijking zodra vaststaat dat het woord niet leeg is. Het probleem met == betreft objectidentiteit, niet elke vergelijking met tekst.

Belangrijkste punten

  • Gebruik equals voor String-inhoud en equalsIgnoreCase om hoofdletters en kleine letters gelijk te behandelen.
  • Een bekende literal kan equals veilig ontvangen als het argument null kan zijn.
  • == controleert String-identiteit, ook als gedeelde literals de fout verbergen.
  • Lees alleen het teken van compareTo.
  • De volgorde van Java-strings is UTF-16-volgorde, geen numerieke of taalspecifieke woordenboekvolgorde.

5.2 Bouw en bewerk tekst met StringBuilder

Een StringBuilder bevat veranderlijke tekst. Die is handig als een lus veel delen toevoegt of als tekens ter plaatse moeten worden bewerkt. Als je enkele delen in één expressie samenvoegt, is + duidelijk, maar als je een groeiende String steeds opnieuw opbouwt, kan de opgebouwde inhoud vaak worden gekopieerd.

Voeg delen achteraan toe en sluit af met een String
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
    if (i > 1) {
        sb.append(", ");
    }
    sb.append(i);
}
String result = sb.toString();

Er is geen import nodig. append voegt strings, chars, getallen of booleaanse waarden achteraan toe. De eerste iteratie voegt alleen 1 toe; de tweede voegt ", " en daarna 2 toe. Het resultaat is "1, 2, 3, 4, 5". Een scheidingsteken na elk getal zetten zou een ongewenst scheidingsteken aan het einde achterlaten. Voor een bestaande lijst met strings regelt String.join(", ", list) de scheidingstekens direct.

Herhaaldelijk text += piece gebruiken in een lus vormt nieuwe onveranderlijke String-resultaten. Het opgebouwde begindeel moet elke keer worden opgenomen, dus de hoeveelheid die wordt gekopieerd kan kwadratisch groeien naarmate een lang resultaat groeit. Een StringBuilder houdt een veranderlijke buffer bij en voegt daaraan toe zonder bij elke iteratie het hele begindeel opnieuw op te bouwen.

Bewerk posities en bereiken
MethodeEffect
insert(i, x)Voegt in op positie i
delete(start, end)Verwijdert een bereik, zonder end
deleteCharAt(i)Verwijdert één char
setCharAt(i, c)Vervangt één char
replace(start, end, text)Vervangt een bereik, zonder end
reverse()Keert de volgorde van de StringBuilder om

length() en charAt(i) lezen de StringBuilder zoals ze een String lezen. Indexen beschrijven de huidige toestand; een invoeging of verwijdering kan latere posities veranderen.

Begin met new StringBuilder("Jva"). insert(1, 'a') levert "Java" op; setCharAt(0, 'j') geeft daarna "java". Bij "2026-10-22" verwijdert delete(4, 7) de posities 4, 5 en 6, zodat "2026-22" overblijft. Als je posities 7 tot en met 9 in "I like tea" vervangt door "coffee", krijg je "I like coffee".

Keten alleen methoden die de StringBuilder teruggeven

new StringBuilder().append("a").append(1).append('b').toString() geeft "a1b". De append-aanroepen geven dezelfde StringBuilder terug, waardoor een volgende aanroep mogelijk is. De bewerkingsmethoden hier geven ook de StringBuilder terug, behalve setCharAt, dat void teruggeeft en een afzonderlijke instructie nodig heeft.

reverse() verandert de ontvanger. Als sb de tekst "stressed" bevat, laat String r = sb.reverse().toString(); zowel r als de tekst van de StringBuilder achter als "desserts". Om de oorspronkelijke StringBuilder te behouden, keer je een nieuwe StringBuilder om die je van de tekst maakt.

Vergelijk de voltooide inhoud

Voeg voor een palindroomcontrole de kleine lettervorm van elke letter in "Was it a car or a cat I saw" toe. De opgeschoonde tekst is "wasitacaroracatisaw". Keer een nieuwe StringBuilder met die tekst om, zet die om naar een String en vergelijk met clean.equals(reversed). De vergelijking is waar.

StringBuilder overschrijft equals niet om de inhoud te vergelijken. Afzonderlijke StringBuilders met "abc" zijn volgens die methode niet gelijk en een StringBuilder is niet gelijk aan een String. Zet eerst om: sb1.toString().equals(sb2.toString()) vergelijkt de werkelijke tekst.

Belangrijkste punten

  • Gebruik append om een lang resultaat op te bouwen en toString om het af te sluiten.
  • Zet scheidingstekens tussen waarden en voorkom een extra scheidingsteken aan het einde.
  • Bewerkingen veranderen de bestaande StringBuilder; eindgrenzen van bereiken zijn uitgesloten.
  • setCharAt geeft void terug en kan dus niet worden geketend.
  • reverse verandert de StringBuilder waarop je de methode aanroept.
  • Zet StringBuilders om naar Strings voordat je de inhoud vergelijkt.

Lijsten, arrays en strings in Java: voorbeelden

5 Walkthroughs

1

Bouw en deel een leeslijst

13 stappen
Maak een lijst, volg veranderingen in de posities en bepaal welke bewerkingen door een andere variabele worden gedeeld.
  1. 1
    IntroductieVolg een veranderende leeslijst

    Een leeslijst kan leeg beginnen en groeien naarmate suggesties binnenkomen. Je voegt titels toe, corrigeert een item, verwijdert een duplicaat en geeft de lijst door aan een methode. Houd tijdens het volgen van de code twee vragen uit elkaar: welk element staat nu op elke index en welke variabelen verwijzen naar hetzelfde lijstobject? De eerste vraag verklaart veranderingen in posities; de tweede verklaart gedeelde bewerkingen.

  2. 2
    UitlegMaak de lege collectie

    Importeer java.util.ArrayList en maak daarna de lijst:

    ArrayList<String> reading = new ArrayList<>();
    reading.add("Orbit");
    reading.add("River");
    

    Het elementtype is String. De lege lijst groeit tot grootte 2 en bevat [Orbit, River]. Index 0 duidt Orbit aan en index 1 duidt River aan. Met de diamantoperator <> kan Java het elementtype afleiden van de linkerkant.

  3. 3
    VoorbeeldVoeg in vóór een opgeslagen titel

    Ga verder met dezelfde lijst:

    reading.add(1, "Cloud");
    String old = reading.set(2, "Forest");
    

    Door de invoeging schuift River van index 1 naar index 2 en krijg je [Orbit, Cloud, River]. De vervanging zet daarna Forest op index 2 en geeft River terug in old. De uiteindelijke lijst is [Orbit, Cloud, Forest]. Anders dan bij invoegen is de grootte door vervangen niet veranderd.

  4. 4
    UitdagingZoek de volgende geldige positie

    De lijst is [Orbit, Cloud, Forest]. Wat gebeurt er als je reading.add(3, "Dune") aanroept? Wat zou reading.get(3) daarna teruggeven?

    ---reveal---

    De invoeging voegt Dune achteraan toe omdat index size() is toegestaan voor invoegen. De grootte wordt 4, dus index 3 is nu geldig om te lezen en geeft "Dune" terug. Index 3 lezen vóór de invoeging zou zijn mislukt.

  5. 5
    UitlegVerwijder één waarde en volg de verschuiving

    Voeg nog een Cloud toe en verwijder daarna op waarde:

    reading.add("Cloud");
    boolean removed = reading.remove("Cloud");
    

    De lijst vóór de verwijdering is [Orbit, Cloud, Forest, Dune, Cloud]. Alleen de eerste Cloud wordt verwijderd, dus het resultaat is [Orbit, Forest, Dune, Cloud] en removed is waar. Forest en elk later element schuiven één positie naar links. De laatste Cloud blijft in de lijst.

  6. 6
    TipVraag of en waar

    Voor [Orbit, Forest, Dune, Cloud] is contains("Orbit") waar en indexOf("Orbit") gelijk aan 0. Een test op een gevonden waarde moet index 0 accepteren: gebruik index != -1 nadat je het zoekresultaat hebt opgeslagen. Een ontbrekende titel geeft -1 terug. Zoekacties vergelijken String-inhoud met onderscheid tussen hoofdletters en kleine letters, dus zoeken naar "orbit" vindt "Orbit" niet. Gebruik lastIndexOf als de laatste overeenkomende positie ertoe doet.

  7. 7
    UitdagingVerwijder een getal op basis van de waarde

    Een afzonderlijke ArrayList<Integer> bevat [9, 1, 9]. Je wilt de eerste waarde 9 verwijderen. Welke aanroep werkt en wat blijft over?

    ---reveal---

    numbers.remove(Integer.valueOf(9)) selecteert verwijdering op waarde en laat [1, 9] over. remove(9) zou index 9 selecteren en die is ongeldig. De primitieve int selecteert een index, ook al bevat de lijst zelf gehele getallen.

  8. 8
    AnalogieTwee namen voor één notitieboek

    Zie een referentie als een briefje waarop staat waar één notitieboek ligt. Een kopie van het briefje maakt geen tweede notitieboek. Met ArrayList<String> shared = reading; duiden beide variabelen één lijst aan, dus shared.add("Coast") is zichtbaar via reading. Een kopieerconstructor, new ArrayList<>(reading), maakt daarentegen een andere lijst met eigen plaatsen.

  9. 9
    VoorbeeldKopieer voordat je wijzigt

    Begin met [Orbit, Forest, Dune, Cloud]:

    ArrayList<String> copy = new ArrayList<>(reading);
    copy.remove("Dune");
    

    De kopie wordt [Orbit, Forest, Cloud], terwijl reading ongewijzigd blijft. Beide lijsten verwezen aanvankelijk naar dezelfde onveranderlijke String-elementen, maar hun lijstplaatsen zijn afzonderlijk. Een plaats uit de ene lijst verwijderen verwijdert die niet uit de andere.

  10. 10
    KernpuntEen parameter is een andere lokale naam

    Een methode ontvangt een kopie van een lijstreferentie. Als je via die parameter titles.clear() aanroept, verandert de gedeelde lijst. De toewijzing titles = new ArrayList<>(); verandert alleen de lokale naam, dus de aanroeper behoudt de oude lijst. Een lege lijst is nog steeds een object; null is geen object. Een aanroep van size() op een lege lijst geeft 0 terug, terwijl een aanroep via null faalt.

  11. 11
    UitdagingOnderscheid gedeelde bewerkingen van lokale hertoewijzing

    De lijst van een aanroeper is [North, South]. De methode voert deze instructies uit:

    titles.remove("North");
    titles = new ArrayList<>();
    titles.add("East");
    

    Wat ziet de aanroeper nog?

    ---reveal---

    De aanroeper ziet [South]. Eerst verandert de verwijdering het gedeelde object. Daarna laat de hertoewijzing alleen de methodeparameter naar een andere lijst verwijzen, dus wordt East aan een andere lijst toegevoegd. De referentie van de aanroeper is nooit omgeleid.

  12. 12
    UitdagingCombineer kopiëren, zoeken en bewerken

    Laat a de lijst [Lake, Hill] bevatten en voer daarna b = new ArrayList<>(a), b.add("Lake") en b.remove(b.indexOf("Lake")) uit. Wat bevatten a en b en geeft a.equals(b) waar terug?

    ---reveal---

    De zoekactie geeft index 0 terug, dus b wordt [Hill, Lake]. Het origineel a blijft [Lake, Hill]. De groottes zijn gelijk maar de volgorde verschilt, dus equals van de lijst geeft onwaar terug.

  13. 13
    SamenvattingVoorspel een wijziging in een lijst

    Lees een bewerking door eerst het doel te bepalen: een positie voor set of verwijdering op index, een waarde voor verwijdering op waarde en een invoegpositie voor add. Werk daarna verschoven indexen bij voordat je de volgende aanroep volgt. Om te voorspellen wat een andere variabele ziet, volg je of die de lijst deelt of een afzonderlijke kopie bevat. Hertoewijzing in een methode raakt de parameter; bewerkingen raken het object waarnaar die parameter op dat moment verwijst.

2

Sla vaste meetwaarden op en kopieer ze

10 stappen
Gebruik vaste arrayplaatsen, bekijk standaardwaarden en behoud gegevens tijdens kopiëren en verwisselen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieGeef elke meetwaarde een vaste plaats
  2. 2
    UitlegMaak de plaatsen aan
  3. 3
    VoorbeeldDruk de benodigde gegevens af
  4. 4
    UitdagingLees de laatste plaats
  5. 5
    VoorbeeldVolg een alias
  6. 6
    VoorbeeldMaak een grotere kopie
  7. 7
    UitdagingKies een inhoudelijke vergelijking
  8. 8
    VoorbeeldSla op voordat je overschrijft
  9. 9
    UitdagingBehoud oude gegevens bij uitbreiding
  10. 10
    SamenvattingOnderscheid plaatswijzigingen van nieuwe opslag
3

Zet meetwaarden om in resultaten

17 stappen
Volg de toestand van een lus, bereken een gemiddelde, zoek op een voorwaarde en verwijder ongewenste waarden veilig.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieGeef elke lus één duidelijke taak
  2. 2
    UitlegLees waarden of lees posities
  3. 3
    UitdagingLaat ruimte voor een buur
  4. 4
    VoorbeeldHoud een som bij tijdens de lus
  5. 5
    VoorbeeldDeel en behoud het deel achter de komma
  6. 6
    KernpuntEen extremum heeft een echte kandidaat nodig
  7. 7
    UitdagingHoud het laatste gelijke maximum bij
  8. 8
    UitlegStop pas als het antwoord bekend is
  9. 9
    VoorbeeldZoek de eerste meetwaarde boven een grens
  10. 10
    UitdagingGa van de eerste overeenkomst naar alle overeenkomsten
  11. 11
    VoorbeeldBekijk hoe voorwaarts verwijderen iets overslaat
  12. 12
    UitlegDoorloop achterwaarts om te verwijderen
  13. 13
    VerbandBehoud de bron door te filteren
  14. 14
    TipGebruik de iterator die de doorloop beheert
  15. 15
    UitdagingBegrens een lus die achteraan toevoegt
  16. 16
    UitdagingBereken het gemiddelde van alleen de geselecteerde waarden
  17. 17
    SamenvattingVolg toestand en stopregels
4

Lees een tekstrecord in stappen

14 stappen
Bekijk tekens, haal een deel met een label eruit en splits een record in numerieke velden.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVan ruwe tekst naar gegevens
  2. 2
    UitlegLees één teken tegelijk
  3. 3
    VoorbeeldTel cijfers in een label
  4. 4
    UitdagingBewaar een transformatie
  5. 5
    UitlegZoek eerst een grens
  6. 6
    VoorbeeldTel de opgenomen posities
  7. 7
    TipKies de opschoonregel
  8. 8
    UitdagingHandel een ontbrekend scheidingsteken af
  9. 9
    UitlegSplits het record in velden
  10. 10
    VoorbeeldConverteer en bereken
  11. 11
    KernpuntScheidingstekens kunnen patronen beschrijven
  12. 12
    UitdagingParse na controle van de vorm
  13. 13
    UitdagingNormaliseer woorden en voeg ze samen
  14. 14
    SamenvattingControleer het resultaattype bij elke stap
5

Vergelijk opdrachten en stel een rapport samen

12 stappen
Kies inhoudelijke vergelijkingen, interpreteer tekstvolgorde en bouw een bewerkbaar resultaat op zonder het origineel te verliezen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVergelijk betekenis en bouw een resultaat op
  2. 2
    UitlegKies een inhoudstest
  3. 3
    VoorbeeldNegeer hoofdletters en kleine letters zonder spaties te negeren
  4. 4
    UitdagingLeg een test met literals uit
  5. 5
    UitlegOrden op de eerste verschillende char
  6. 6
    UitdagingBehoud de vroegste tekstkandidaat
  7. 7
    UitlegVoeg toe aan één veranderlijke reeks
  8. 8
    VoorbeeldZet scheidingstekens tussen delen
  9. 9
    VoorbeeldBewerk de huidige posities
  10. 10
    UitdagingBehoud de oorspronkelijke volgorde
  11. 11
    UitdagingBouw een gefilterd rapport
  12. 12
    SamenvattingGebruik de bewerking die bij de vraag past

Lijsten, arrays en strings in Java: oefenvragen

40 Oefenvragen in 4 sets

Set 1: Volg lussen en verwerk tekst10 Oefenvragen

Vraag 1 van 10

Wat bevat de array {2, 6, 9} na for (int n : values) { n += 3; }?
  1. [5, 9, 12]
  2. [3, 3, 3]
  3. [9, 9, 9]
  4. [2, 6, 9]
Toon antwoordVerberg antwoord
Antwoord: D
Elke iteratie kopieert een arraywaarde naar de lokale variabele n. Die lokale variabele bijwerken schrijft niet terug naar een opgeslagen plaats, dus de array blijft [2, 6, 9]. Voor het resultaat [5, 9, 12] is een lus met index nodig die aan values[i] toewijst.

Vraag 2 van 10

Een lijst met gehele getallen bevat [5, 8, 9]. Welke waarde levert (double) (total / values.size()) op nadat de som is opgeslagen in een int total?
  1. 7.333333333333333
  2. 7.0
  3. 22.0
  4. 3.0
Toon antwoordVerberg antwoord
Antwoord: B
De som is 22, maar door de haakjes wordt vóór de expliciete typeconversie geheeltallig door 3 gedeeld, wat 7 oplevert. De typeconversie verandert dat resultaat daarna in 7,0. Om het deel achter de komma te behouden, converteer je vóór het delen een operand, zoals in (double) total / values.size().

Vraag 3 van 10

Welk paar drukt deze code af voor de niet-lege lijst [-8, -3, -3, -6]?

int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
    int n = values.get(i);
    total += n;
    if (n >= values.get(best)) {
        best = i;
    }
}
System.out.println(best + ": " + (double) total / values.size());
  1. 2: -5.0
  2. 1: -5.0
  3. 2: -3.0
  4. 0: -5.0
Toon antwoordVerberg antwoord
Antwoord: A
Het totaal is -20, dus een zwevendekommagetallendeling door vier geeft -5.0 als uitvoer. Het maximum -3 staat op index 1 en 2 en >= vervangt de kandidaat bij een gelijke waarde, zodat index 2 behouden blijft. Met > zou index 1 behouden blijven, omdat gelijke vervangingen dan worden afgewezen.

Vraag 4 van 10

De methode wordt aangeroepen met {“Birch”, “Cedar”, “Maple”} en doelwaarde “Maple”. Wat geeft de methode terug?

static int find(String[] a, String target) {
    for (int i = 0; i < a.length; i++) {
        if (a[i].equals(target)) return i;
        else return -1;
    }
    return -1;
}
  1. 0
  2. 2
  3. -1
  4. 3
Toon antwoordVerberg antwoord
Antwoord: C
Het eerste element Birch komt niet overeen met Maple, dus de else geeft direct -1 terug. De lus bereikt index 2 nooit. Een correcte zoekactie naar de eerste overeenkomst zet de terugkeerwaarde voor een mislukte zoekactie na de lus, zodat elke kandidaat kan worden gecontroleerd voordat de doelwaarde als ontbrekend wordt beschouwd.

Vraag 5 van 10

Welke lijst blijft over na deze lus?

ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
    if (a.get(i) % 2 == 0) a.remove(i);
}
  1. [7]
  2. [4, 7]
  3. [4, 7, 2]
  4. [4, 4, 7]
Toon antwoordVerberg antwoord
Antwoord: B
Door index 0 te verwijderen schuift de tweede 4 naar index 0, maar de volgende iteratie gebruikt index 1 en ziet 7. Index 2 bevat daarna 2, die wordt verwijderd, zodat [4, 7] overblijft. Het resultaat [7] gaat ervan uit dat de verschoven 4 opnieuw wordt bezocht, wat deze onvoorwaardelijke verhoging voorkomt.

Vraag 6 van 10

Wat levert "Count: " + 2 + 6 op?
  1. "Count: 26"
  2. "Count: 8"
  3. "8Count: "
  4. "Count: 2 6"
Toon antwoordVerberg antwoord
Antwoord: A
De eerste + heeft links een string, dus wordt 2 als tekst samengevoegd. De volgende + voegt 6 aan die tekst toe, wat "Count: 26" oplevert. Voor "Count: 8" zouden haakjes rond 2 + 6 nodig zijn om eerst de optelling uit te voeren.

Vraag 7 van 10

Wat is voor String code = "AB:472:Q"; de waarde van code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?
  1. ":472"
  2. "472:"
  3. "47"
  4. "472"
Toon antwoordVerberg antwoord
Antwoord: D
De eerste dubbele punt staat op index 2 en de laatste op index 6, dus de expressie neemt substring(3, 6). Die omvat de drie cijfers en sluit de dubbele punt aan het einde uit. Als je die laatste dubbele punt meeneemt, behandel je de eindindex ten onrechte als inbegrepen.

Vraag 8 van 10

Welk type geeft "Mina;18;Oslo".split(";") terug?
  1. ArrayList<String>
  2. String
  3. String[]
  4. int[]
Toon antwoordVerberg antwoord
Antwoord: C
Splitsen levert een array met tekstvelden op, dus het resultaattype is String[]. Het veld "18" blijft tekst totdat het wordt geparset; split leidt geen getallen af. Hoewel een ArrayList later de velden zou kunnen bevatten, geeft de methode zelf een array terug.

Vraag 9 van 10

Hoeveel velden levert deze expressie op?

"x,y,,".split(",")
  1. 3
  2. 4
  3. 2
  4. 1
Toon antwoordVerberg antwoord
Antwoord: C
Standaard laat split lege delen aan het einde weg, zodat "x" en "y" overblijven. De methode geeft daarom een array met lengte 2 terug. Als je elke komma telt en er één bij optelt, krijg je vier schijnbare posities, maar negeer je de regel dat lege delen aan het einde worden weggelaten.

Vraag 10 van 10

Wat wordt afgedrukt?

String[] p = "  Omar, 12, 5  ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
  1. 2.4
  2. 12.5
  3. NumberFormatException
  4. 2.0
Toon antwoordVerberg antwoord
Antwoord: D
Door trim op elk numeriek veld toe te passen slaagt het parsen naar gehele getallen, wat 12 en 5 oplevert. Hun deling is nog steeds een geheeltallige deling en geeft dus 2 voordat de toewijzing aan double dat omzet naar de uitvoer 2.0. Een double als bestemming alleen behoudt het deel achter de komma van gehele operanden niet.
Set 2: Maak, bewerk en deel collecties10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke declaratie maakt een lege, wijzigbare lijst met gehele getallen? Ga ervan uit dat ArrayList en List zijn geïmporteerd.
  1. ArrayList<int> n = new ArrayList<>();
  2. Integer[] n = new Integer[0];
  3. ArrayList<Integer> n = new ArrayList<>();
  4. List<Integer> n = List.of();
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Wat drukt dit af?

ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
  1. ruler: [pen, tape, clip]
  2. tape: [pen, clip, ruler]
  3. ruler: [pen, clip, tape]
  4. clip: [pen, tape, clip]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een ArrayList<Integer> bevat [12, 24, 36]. Welke aanroep verwijdert de waarde 24?
  1. values.remove(24);
  2. values.remove(Integer.valueOf(1));
  3. values.set(1, 24);
  4. values.remove(Integer.valueOf(24));
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een namenlijst bevat [Nora, Ravi, Nora, Mei]. Wat zijn na names.remove("Nora") de waarden van names.indexOf("Nora") en names.lastIndexOf("Mei"), in die volgorde?
  1. 0 and 3
  2. 1 and 2
  3. -1 and 2
  4. 2 and 3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat is de inhoud van a en c na deze code?

ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
  1. a: [oak]; c: [ash]
  2. a: [oak, elm]; c: [ash]
  3. a: [ash, elm]; c: [ash, elm]
  4. a: [oak, elm]; c: [ash, elm]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat geeft Arrays.toString(new boolean[3]) terug?
  1. "[null, null, null]"
  2. "[0, 0, 0]"
  3. "[]"
  4. "[false, false, false]"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een double[] readings heeft lengte 6. Welke expressie leest de laatste plaats?
  1. readings[5]
  2. readings[6]
  3. readings.get(5)
  4. readings[readings.length()]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Wat is de inhoud van a en b na deze code?

int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
  1. a: [8, 3]; b: [8, 3, 0]
  2. a: [7, 3]; b: [8, 3]
  3. a: [7, 3]; b: [8, 3, 0]
  4. a: [7, 3, 0]; b: [8, 3, 0]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Twee afzonderlijk gemaakte arrays bevatten elk {6, 2}. Wat zijn de resultaten van a.equals(b) en Arrays.equals(a, b), in die volgorde?
  1. false, true
  2. true, true
  3. true, false
  4. false, false
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Wat bevat de lijst van de aanroeper na edit(a)?

static void edit(ArrayList<Integer> x) {
    x.set(0, x.get(0) + 2);
    x = new ArrayList<>(x);
    x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
  1. [5, 8]
  2. [7, 8, 9]
  3. [7, 8]
  4. [5, 8, 9]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Vergelijk waarden en spoor fouten op10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke expressie controleert veilig of een mogelijk null zijnde String met de naam reply precies “ready” bevat?
  1. reply.equals("ready")
  2. "ready".equals(reply)
  3. reply == "ready"
  4. reply.compareTo("ready") == 0
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een StringBuilder bevat “note”. Welke tekst bevat die na sb.append(3)?
  1. "note"
  2. "3note"
  3. "note 3"
  4. "note3"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Waarnaar evalueert "18".compareTo("4") < 0 en waarom?
  1. true; the first character decides the order
  2. false; eighteen is greater than four
  3. true; two-character strings always come first
  4. false; the longer string always comes later
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Welke tekst is opgeslagen in result?

StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
  1. "pie"
  2. "pilane"
  3. "pine"
  4. "pline"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat drukt deze code af?

String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
  1. Beide variabelen behouden hun oorspronkelijke tekst in kleine letters.
  2. Beide variabelen verwijzen naar het resultaat in hoofdletters.
  3. De oorspronkelijke tekst wordt omgezet naar hoofdletters; het nieuwe resultaat blijft in kleine letters.
  4. De oorspronkelijke tekst blijft in kleine letters; de opnieuw toegewezen variabele bevat hoofdletters.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat drukt dit af?

String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
    if (a[i].startsWith("b")) {
        if (first == -1) first = i;
        matches++;
    }
}
System.out.println(first + ":" + matches);
  1. 1:2
  2. 2:2
  3. 1:1
  4. -1:2
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Welke lijst blijft over na deze code?

ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
    if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
    a.add(a.get(i) * 2);
}
  1. [5, 2, 10, 4]
  2. [5]
  3. [5, 10]
  4. [2, 5, 2, 4, 10, 4]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Wat zijn a en b nadat de code is uitgevoerd?

int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
  1. a: [11, 4, 8]; b: [8, 0, 11, 0]
  2. a: [8, 4, 11]; b: [8, 0, 11, 0]
  3. a: [8, 0, 11]; b: [8, 0, 11, 0]
  4. a: [8, 4, 8]; b: [8, 0, 8, 0]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een lijst is leeg. Een programma test names.indexOf("Iris") >= 0 voordat het get met dat resultaat aanroept. Wat gebeurt er?
  1. De test is onwaar, dus get wordt overgeslagen.
  2. De test is waar en get geeft null terug.
  3. indexOf werpt een exceptie omdat de lijst leeg is.
  4. De test is waar en get werpt een exceptie.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Wat wordt afgedrukt?

StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
  1. drawer:reward
  2. x:reward
  3. reward:reward
  4. reward:drawer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Combineer collectie- en tekstbewerkingen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Wat zijn de resultaten van " ".isEmpty() en " ".isBlank(), in die volgorde?
  1. true, true
  2. false, false
  3. false, true
  4. true, false
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Welke delen levert deze expressie op?

"  north   east west ".trim().split("\\s+")
  1. [north, east, west]
  2. [, north, east, west]
  3. [north, , , east, west]
  4. [north east west]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een niet-lege namenlijst bevat ["zen", "Able", "apple"]. Een lus bewaart de eerste kandidaat en vervangt die als name.compareTo(first) < 0. Welke naam blijft over?
  1. apple, omdat de vergelijking hoofdletters en kleine letters negeert
  2. Able, omdat de eerste char vóór de kleine letters komt
  3. zen, omdat latere kandidaten er nooit vóór komen
  4. Geen kandidaat, omdat de vergelijking door gemengde hoofdletters en kleine letters een exceptie opwerpt
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een ArrayList<String> heeft grootte 4. Wat gebeurt er als op add(4, "new") de aanroep get(4) volgt?
  1. The insertion throws; get is never reached.
  2. The insertion succeeds; get throws afterward.
  3. The insertion replaces the old final element.
  4. The insertion succeeds; get returns "new".
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat zijn de uiteindelijke lijst out en het gemiddelde?

int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
    if (n > 0) {
        out.add(n);
        sum += n;
    }
}
double average = (double) sum / out.size();
  1. [6, 10] and 4.0
  2. [6, 10] and 8.0
  3. [-2, 6, 10, 0] and 3.5
  4. [6, 10, 0] and 5.333333333333333
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Welke index wordt teruggegeven voor de getoonde invoer?

static int firstLong(String[] words, int min) {
    for (int i = 0; i < words.length; i++) {
        String clean = words[i].trim();
        if (clean.length() >= min) return i;
    }
    return -1;
}
// Call:
firstLong(new String[] {"  ox  ", "pine", " map ", "cedar"}, 4)
  1. 0
  2. 3
  3. -1
  4. 1
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Wat zijn a en kept na deze code?

ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
    if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
  1. a: [9, -1, -1, 5]; kept: [2, 5]
  2. a: [9, 5]; kept: [9, 5]
  3. a: [9, -1, -1, 5]; kept: [9, 5]
  4. a: [9, -1, -1, 5]; kept: [2, -1, 5]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

De methode moet de tekst na de eerste “#” teruggeven, of “missing” als er geen markering is. Welke vervanging laat de methode werken voor zowel de invoer “tag#blue” als “plain”?

static String tail(String s) {
    int p = s.indexOf("#");
    MISSING
}
  1. if (p == 0) return "missing"; return s.substring(p + 1);
  2. if (p == -1) return "missing"; return s.substring(p);
  3. if (p == -1) return "missing"; return s.substring(p + 1);
  4. if (p > 0) return "missing"; return s.substring(p + 1);
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Welke String geeft de methode terug voor de array {“A”, “B”, “C”}?

static String report(String[] parts) {
    StringBuilder sb = new StringBuilder();
    for (int i = parts.length - 1; i >= 0; i--) {
        if (sb.length() > 0) sb.append("/");
        sb.append(parts[i]);
    }
    sb.deleteCharAt(2);
    return sb.toString();
}
  1. "C/B/A"
  2. "C/BA"
  3. "A//C"
  4. "C//A"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Wat zijn a en b na change(a)?

static void change(ArrayList<String> x) {
    x.remove("red");
    x = new ArrayList<>();
    x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
  1. a: [gold]; b: [blue, red]
  2. a: [blue, red]; b: [blue, red]
  3. a: [blue]; b: [blue]
  4. a: [red, blue, red]; b: [red, blue, red]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

66 Kernbegrippen, elk met een definitie

A

Accumulator
Een accumulator bewaart een resultaat dat tijdens iteraties van een lus wordt opgebouwd. De beginwaarde wordt vóór de lus ingesteld en verandert terwijl relevante elementen worden verwerkt.
Een accumulator voor een som begint bij 0 en telt elke afstand erbij op, zodat het programma het totale aantal kilometers kan rapporteren.
Achteraan toevoegen
Achteraan toevoegen plaatst de tekstrepresentatie van een waarde aan het einde van een StringBuilder en geeft dezelfde StringBuilder terug voor verdere aanroepen.
Als je 4 achter “Page ” toevoegt, verandert de StringBuilder in “Page 4” zonder afzonderlijke hertoewijzing.
Achterwaarts verwijderen
Achterwaarts verwijderen bezoekt lijstindexen van de laatste naar de eerste, zodat verwijdering alleen elementen verschuift die de lus al heeft gecontroleerd.
Achterwaarts verwijderen verwijdert aangrenzende negatieve waarden zonder de waarde over te slaan die na een verwijdering naar links schuift.
Alias
Een alias is een andere variabele of naam die naar hetzelfde object verwijst, zodat bewerkingen via de ene naam zichtbaar zijn via de andere.
Na b = a is b een alias van a; b.clear() maakt de lijst leeg die via beide variabelen wordt gelezen.
Array
Een array is een object met een vast aantal plaatsen van hetzelfde type, die je via indexen vanaf nul met vierkante haken benadert.
Een array met zeven doubles kan voor elke dag van een week één temperatuur in graden Celsius opslaan.
Array-initialisator
Een array-initialisator levert elementwaarden bij het maken van een array, waarbij het aantal waarden de lengte van de array bepaalt.
De array-initialisator in int[] a = {3, 6, 9}; maakt drie plaatsen met die waarden.
ArrayIndexOutOfBoundsException
Een ArrayIndexOutOfBoundsException meldt een poging om een arraypositie buiten het geldige indexbereik te lezen of te schrijven.
Een ArrayIndexOutOfBoundsException ontstaat wanneer code index 4 van een array met vier elementen leest.
Arraykopie
Een arraykopie is een afzonderlijke array die met waarden uit een bestaande array is gevuld, eventueel met een andere lengte en extra plaatsen met standaardwaarden.
Een arraykopie die met Arrays.copyOf(a, 5) wordt gemaakt, kan de opslag vergroten zonder de lengte van a te veranderen.
ArrayList
Een ArrayList is een geordende, wijzigbare lijst waarvan het aantal elementen groeit of krimpt als waarden worden toegevoegd of verwijderd.
Een ArrayList kan namen verzamelen terwijl mensen die invoeren, zonder dat het uiteindelijke aantal vooraf bekend hoeft te zijn.
Autoboxing
Autoboxing is de automatische omzetting door Java van een primitieve waarde naar een object van de bijbehorende wrapperklasse.
Door autoboxing is numbers.add(8) mogelijk, ook al is het elementtype van de lijst Integer en niet int.

C

char
Een char is een primitieve Java-waarde die één UTF-16-code-eenheid opslaat en als tekenliteral tussen enkele aanhalingstekens wordt geschreven.
De char die "book".charAt(0) teruggeeft is 'b', terwijl "b" een String met lengte 1 is.
compareTo
De methode compareTo geeft een negatieve waarde, nul of een positieve waarde terug afhankelijk van de volgorde van de ontvanger ten opzichte van het argument.
String compareTo gebruikt UTF-16-charwaarden, dus een resultaat onder nul betekent dat de ontvanger eerst komt.
Concatenatie
Concatenatie voegt waarden samen tot tekst; in Java gebeurt String-toevoeging met + van links naar rechts, tenzij haakjes de groepering veranderen.
Door concatenatie levert "N=" + 2 + 5 de waarde "N=25" op, omdat de getallen worden samengevoegd nadat de tekst begint.
ConcurrentModificationException
Een ConcurrentModificationException kan melden dat een collectie is veranderd op een manier waarop de actieve iterator niet is voorbereid.
Een ConcurrentModificationException kan binnen één thread optreden wanneer een for-each-body uit de bronlijst verwijdert.

D

Deelstring
Een deelstring is een aaneengesloten deel van een String, geselecteerd met een beginindex en eventueel een eindindex die is uitgesloten.
De deelstring van index 1 tot en met 3 van "planet" selecteer je met substring(1, 4); de deelstring luidt “lan”.
Doorlopen
Doorlopen is het systematisch bezoeken van elementen in een collectie, bijvoorbeeld met een lus van het eerste tot het laatste element.
Bij achterwaarts doorlopen begin je bij de laatste index en bereik je index 0 voordat de lus eindigt.

E

Exclusieve eindgrens
Een exclusieve eindgrens markeert de eerste positie die buiten een bereik blijft, waardoor het aantal opgenomen posities gelijk is aan eind min begin.
De exclusieve eindgrens 5 in substring(2, 5) omvat posities 2, 3 en 4, maar laat positie 5 weg.

F

Filter
Een filter selecteert elementen die aan een voorwaarde voldoen en kan die in een nieuwe lijst verzamelen terwijl de oorspronkelijke collectie ongewijzigd blijft.
Een filter behoudt woorden met een lengte van minstens vijf door overeenkomende woorden aan een afzonderlijke resultatenlijst toe te voegen.
for-each-lus
Een for-each-lus bezoekt elke elementwaarde op volgorde zonder expliciete index en zet die waarde in een lokale lusvariabele.
Een for-each-lus kan arraywaarden optellen, maar een nieuwe waarde aan de int-variabele toewijzen vervangt de arrayplaatsen niet.

G

Geheeltallige deling
Een geheeltallige deling deelt gehele operanden en kapt het deel achter de komma af, ook als het resulterende quotiënt later als double wordt opgeslagen.
Door geheeltallige deling is 17 / 4 gelijk aan 4; als je eerst een operand expliciet converteert, is het resultaat met een deel achter de komma 4,25.

H

Hoofdlettergevoelige vergelijking
Een hoofdlettergevoelige vergelijking behandelt hoofdletters en kleine letters als verschillend bij het bepalen of tekst overeenkomt.
Een hoofdlettergevoelige vergelijking met String equals stelt vast dat “Go” en “go” een verschillende inhoud hebben.

I

Identiteitsvergelijking
Een identiteitsvergelijking controleert of referenties hetzelfde object aanduiden, ongeacht of afzonderlijke objecten gelijke gegevens bevatten.
Een identiteitsvergelijking met a == b is onwaar voor afzonderlijke arrays die dezelfde gehele getallen bevatten.
Index
Een index is een positie vanaf nul die een element in een lijst, array of string aanduidt; de eerste positie is 0.
De index van het laatste element in een lijst met vier elementen is 3, dus get(3) leest dat element.
Inhoudelijke gelijkheid
Inhoudelijke gelijkheid controleert of containers overeenkomstige gelijke elementen in dezelfde volgorde bevatten, zonder te vereisen dat het om één gedeeld object gaat.
Bij int-arrays test je inhoudelijke gelijkheid met Arrays.equals(a, b), niet met equals van de array.
Inhoudelijke vergelijking
Een inhoudelijke vergelijking test tekens of waarden die in objecten zijn opgeslagen, zodat afzonderlijke String-objecten kunnen overeenkomen als hun tekst gelijk is.
Een inhoudelijke vergelijking met reply.equals("go") herkent overeenkomende tekst ook als de objecten verschillen.
Iterator
Een iterator houdt de voortgang bij het doorlopen van een collectie bij, levert de volgende waarde en ondersteunt verwijdering via een eigen methode.
Een Iterator kan het zojuist gelezen even getal verwijderen met it.remove() en tegelijk doorgaan met het doorlopen van de lijst.

L

length-veld
Het length-veld geeft het vaste aantal plaatsen in een array aan en wordt gelezen zonder de haakjes die je bij een methodeaanroep gebruikt.
Het length-veld van new int[4] is 4, zelfs voordat het programma eigen waarden naar de plaatsen schrijft.
Letterlijke vervanging
Een letterlijke vervanging vervangt exact overeenkomende tekst of tekens zonder het doel als een patroon van een reguliere expressie te interpreteren.
Een letterlijke vervanging met replace(".", "-") verandert de punten in “a.b.c” in koppeltekens.
Lexicografische volgorde
De lexicografische volgorde vergelijkt reeksen op hun eerste verschillende positie en plaatst een kortere string met een gelijk begin vóór een langere.
De lexicografische volgorde van Java plaatst “12” vóór “8” omdat de eerste verschillende char '1' tegenover '8' is.
Lineair zoeken
Lineair zoeken controleert elementen één voor één totdat een overeenkomst de vraag beantwoordt of het einde vaststelt dat geen element overeenkomt.
Een lineaire zoekactie naar een ontbrekende naam in 14 items controleert alle 14 voordat de waarde voor een mislukt resultaat wordt teruggegeven.
Lus met index
Een lus met index bezoekt elementen via een expliciete positievariabele, zodat de lusbody posities kan lezen of opgeslagen waarden kan vervangen.
Een lus met index kan namen met regelnummers afdrukken door names.get(i) te lezen en i + 1 weer te geven.
Lusgrens
Een lusgrens is een grens in de voorwaarde van een lus die bepaalt welke posities of iteraties de lusbody mag verwerken.
Een lusgrens van i < a.length - 1 laat ruimte om de rechterbuur op a[i + 1] te lezen.

M

Maximum
Een maximum is de grootste waarde in een niet-lege gegevensverzameling; een lus kan de beste waarde tot dan toe of de index ervan bijhouden.
Het maximum van {-7, -2, -5} is -2, wat een op nul geïnitialiseerde beste waarde niet zou opleveren.
Methoden ketenen
Methoden ketenen is een volgende methode direct aanroepen op een resultaat dat door een eerdere aanroep is teruggegeven, zoals wanneer append dezelfde StringBuilder teruggeeft.
Methoden ketenen maakt sb.append("x").append(2) mogelijk, maar kan niet doorgaan vanaf setCharAt, dat void teruggeeft.

N

NaN
NaN betekent “geen getal” en is een zwevendekommaresultaat voor bewerkingen zoals een totaal van nul delen door een aantal van nul.
Een gemiddelde van lege gegevens dat als 0.0 / 0 wordt berekend, levert NaN op in plaats van een bruikbare meetwaarde.
Niet-wijzigbare lijst
Een niet-wijzigbare lijst wijst veranderingen aan de elementen en de structuur af, waaronder toevoegen, verwijderen en vervangen.
De niet-wijzigbare lijst die List.of("east", "west") teruggeeft, wijst een latere aanroep van set af.
null
null is de referentiewaarde die geen object aanduidt, zodat via die referentie geen instantiemethode kan worden aangeroepen.
Een null-resultaat moet worden gecontroleerd voordat code length() aanroept op een String die een zoekactie mogelijk teruggeeft.
NumberFormatException
Een NumberFormatException meldt dat tekst met de gevraagde parseermethode niet naar het numerieke type kan worden omgezet.
Een NumberFormatException ontstaat bij Integer.parseInt(" 18") omdat de spatie aan het begin niet wordt geaccepteerd.

O

Ondiepe kopie
Een ondiepe kopie maakt een afzonderlijke container en kopieert de elementwaarden of referenties zonder objecten waarnaar wordt verwezen te dupliceren.
Een ondiepe kopie van een lijst met strings heeft onafhankelijke lijstplaatsen die nog steeds naar dezelfde String-objecten verwijzen.
Onveranderlijkheid
Onveranderlijkheid betekent dat de opgeslagen toestand van een object na het maken niet kan veranderen, zodat String-transformaties resultaten teruggeven zonder het object te bewerken.
Door de onveranderlijkheid van een String blijft een oude alias ongewijzigd wanneer een andere variabele het resultaat van toUpperCase() bewaart.
Overladen methodevariant
Een overladen methodevariant is een van meerdere methoden met dezelfde naam maar verschillende parametertypen of aantallen parameters.
De overladen methodevariant voor verwijderen die door een int-argument wordt geselecteerd, behandelt dat argument als een index.

P

Palindroom
Een palindroom leest vooruit en achteruit hetzelfde volgens de gekozen vergelijkingsregel, bijvoorbeeld als je het verschil tussen hoofdletters en kleine letters en tekens die geen letters zijn buiten beschouwing laat.
Een palindroomcontrole kan letters normaliseren, een nieuwe StringBuilder omkeren en de resulterende Strings vergelijken.
Parsen
Parsen zet tekst om naar een gestructureerde waarde, zoals een int of double, volgens de syntaxis die de gekozen methode accepteert.
De tekst “3.5” parsen met Integer.parseInt faalt omdat die methode tekst met gehele getallen zonder decimaalpunt accepteert.

R

Referentie
Een referentie is een waarde die een object aanduidt, zodat een variabele dat object kan bereiken in plaats van de inhoud ervan direct te bevatten.
Via een gekopieerde referentie kunnen twee variabelen elementen toevoegen aan hetzelfde ArrayList-object in het geheugen.
Reguliere expressie
Een reguliere expressie is een tekstpatroon waarvan symbolen meer overeenkomsten kunnen beschrijven dan alleen exacte letterlijke tekens, zoals bij scheidingstekens voor String split.
Een reguliere expressie met een punt zonder escape komt overeen met tekens, zodat je daarmee niet alleen bij letterlijke punten splitst.

S

Samenvoegen
Samenvoegen combineert tekstdelen tot één String met een gekozen scheidingsteken tussen de delen in plaats van na het laatste deel.
Samenvoegen met String.join("/", pieces) zet de delen “a”, “b” en “c” om in de tekst “a/b/c”.
Signaalwaarde
Een signaalwaarde is een speciaal gekozen resultaat dat een situatie zoals het ontbreken van een overeenkomst aangeeft en verschilt van gewone succesvolle resultaten.
De signaalwaarde -1 geeft aan dat een zoekactie naar een index is mislukt, omdat geen geldige index negatief kan zijn.
Splitsen
Splitsen verdeelt tekst bij overeenkomsten met een scheidingspatroon en geeft een array met tekstdelen terug zonder de scheidingstekens zelf.
Splitsen bij komma’s zet “Nia,25,Lima” om in drie strings, waaronder de nog niet geparste tekst met een getal.
Standaardwaarde
Een standaardwaarde is de beginwaarde die Java aan een nieuw gemaakte arrayplaats toekent, zoals nul, false of null, afhankelijk van het type.
De standaardwaarde op elke plaats van een nieuwe String-array is null, dus daarop kunnen nog geen String-methoden worden uitgevoerd.
String
Een String is een onveranderlijk Java-object dat tekst weergeeft als een reeks UTF-16-charwaarden die via posities vanaf nul worden benaderd.
Een String met een naam kan veilig worden gedeeld omdat omzetting naar hoofdletters of kleine letters het oorspronkelijke object niet bewerkt.
StringBuilder
Een StringBuilder is een veranderlijke tekenreeks die efficiënt herhaald toevoegen en bewerken van huidige posities of bereiken ondersteunt.
Een StringBuilder kan een rapport met meerdere regels samenstellen zonder na elke toegevoegde regel het hele begindeel opnieuw op te bouwen.
Structurele wijziging
Een structurele wijziging verandert de grootte of onderliggende structuur van een ArrayList, bijvoorbeeld door tijdens het doorlopen een element toe te voegen of te verwijderen.
Een structurele wijziging via de bronlijst kan de toestand van de bijbehorende for-each-iterator ongeldig maken.

T

Tijdelijke variabele
Een tijdelijke variabele bewaart een tussenwaarde terwijl andere toewijzingen de posities veranderen waaruit die waarde is gelezen.
Een tijdelijke variabele bewaart het eerste element tijdens een verwisseling, zodat de volgende toewijzing het niet verloren laat gaan.

U

Unboxing
Unboxing is de automatische omzetting door Java van de opgeslagen waarde van een wrapperobject naar het bijbehorende primitieve type.
Unboxing levert een int wanneer int first = numbers.get(0); een Integer-lijstelement leest.
UTF-16-code-eenheid
Een UTF-16-code-eenheid is de eenheid die een Java-char opslaat; een weergegeven symbool kan één eenheid of een paar eenheden nodig hebben.
Een emoji kan twee UTF-16-code-eenheden innemen, wat invloed heeft op de telling die String length() teruggeeft.

V

Veld
Een veld is één gegevensdeel in een record, vaak gescheiden van aangrenzende delen door een scheidingsteken zoals een komma of puntkomma.
Het tweede veld van “Ari,18,4” moet worden geparset als een programma de numerieke waarde ervan nodig heeft voor een berekening.
Verwijdering op index
Verwijdering op index verwijdert het element op een gegeven positie, geeft dat element terug en verschuift elk later element naar links.
Verwijdering op index verandert [a, b, c] in [a, c] wanneer remove(1) het middelste element verwijdert.
Verwijdering op waarde
Verwijdering op waarde verwijdert het eerste gelijke element en geeft terug of er daadwerkelijk een overeenkomend element is verwijderd.
Bij verwijdering op waarde blijft in [a, b, a] één dubbele waarde over nadat remove("a") de eerste a heeft verwijderd.
Voortijdige terugkeer
Een voortijdige terugkeer beëindigt een methode zodra het resultaat bekend is, bijvoorbeeld wanneer een zoekactie naar de eerste overeenkomst een overeenkomend element bereikt.
Een voortijdige terugkeer vanuit de bijbehorende if voorkomt dat namen na de eerste succesvolle overeenkomst worden gecontroleerd.
Voorwaardelijke telling
Een voorwaardelijke telling houdt bij hoeveel elementen aan een test voldoen door alleen 1 bij een teller op te tellen als de test slaagt.
Een voorwaardelijke telling kan bijhouden hoeveel dagelijkse temperaturen boven 30 graden Celsius liggen.

W

Waardeoverdracht
Waardeoverdracht betekent dat een methodeparameter een kopie van de waarde van een argument ontvangt, inclusief een gekopieerde referentie voor een object.
Door waardeoverdracht kan een lijstparameter gedeelde elementen bewerken, maar blijft hertoewijzing van de parameter lokaal.
Wijziging ter plaatse
Een wijziging ter plaatse verandert de toestand van een bestaand object, zodat referenties die al naar dat object verwijzen de gewijzigde inhoud zien.
Een wijziging ter plaatse met reverse() verandert de oorspronkelijke StringBuilder, zodat aliassen de omgekeerde tekst ook zien.
Witruimte
Witruimte bestaat uit tekens voor ruimte of scheiding die door een bepaalde test worden herkend, waaronder spaties, tabs en regeleinden.
Java-witruimte wordt herkend door Character.isWhitespace, dat ook wordt gebruikt door strip() en isBlank().
Wrapperklasse
Een wrapperklasse stelt een primitieve waarde voor als een object, zodat waarden zoals gehele getallen als lijstelementen kunnen worden gebruikt.
Dankzij de wrapperklasse Integer kan een ArrayList<Integer> getallen opslaan die als int-waarden worden aangeboden.

Z

Zoekpredicaat
Een zoekpredicaat is een test die waar of onwaar oplevert en bepaalt of een element aan een zoekvoorwaarde voldoet, zoals een vereist begin van een woord.
Het zoekpredicaat city.startsWith("M") vindt namen op basis van een voorwaarde in plaats van één exacte waarde.
Zoekresultaat
Een zoekresultaat geeft aan of en waar overeenkomende gegevens zijn gevonden; zoekacties naar een lijstindex gebruiken -1 om aan te geven dat er geen overeenkomst is.
Het zoekresultaat van names.indexOf("Kai") kan 0 zijn, dus een test of iets is gevonden moet die index accepteren.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag