...
Java har innebygget støtte for enkle tabeller (eng: array), både for objekter (f.eks. String) og enkle datatyper (f.eks. int), men disse har svært begrenset funksjonalitet og har en forhåndsdefinert kan bl.a. ikke endre lengde. Ved å bruke en ArrayList kan man lage dynamiske lister og manipulere innholdet med et vell av hendige metoder.
...
Code Block | ||
---|---|---|
| ||
// husk import java.util.ArrayList; ArrayList<String>List<String> list1 = new ArrayList<String>(); // lager en ny tom liste spesialisert til å inneholde String-objekter ... fyll list1 med innhold her ArrayList<String>List<String> list2 = new ArrayList<String>(list1); // lager en liste med samme innhold som list1 |
I koden over, så lager en to ArrayList-instanser, som lagres i hver sin variabel. Variablene er deklarert som List, som er grensesnittet (eng: interface) som ArrayList implementerer og som definerer alle relevante metoder. Ved å deklarere variablene som List og ikke ArrayList, så gjør vi det tydelig at vi ikke er interessert i å bruke de få ArrayList-metodene som ikke er en del av List-grensesnittet.
Som vi ser over, så angir man ved deklarasjon bruk av ArrayList-variabler og ved opprettelsen av en ny List og ArrayList hva slags type objekter man ønsker å ha i listen. Dette er strengt tatt ikke nødvendig, men det hjelper Java med å sjekke at vi bruker den riktig, f.eks. at vi putter rett type data inn i dem og at vi er forberedt på typen data som hentes ut. Eksempelvis vil en ikke kunne legg tall inn i en ArrayList<String>, kun String-objekter. Og når en tar objekter ut av lista, så vet Java at de er av typen String og vil ikke la oss tilordne dem til tall-variabler. Hvis en vil lage lister med bestemte elementer fra starten, så kan man bruke hjelpemetoden Arrays.asList:
Code Block | ||
---|---|---|
| ||
// husk import java.util.ArrayList, java.util.List og java.util.Arrays; List<String> list1 = Arrays.asList("en", "to", "tre"); // lager en ny ikke-modifisertbar liste som inneholder elementene "en", "to" og "tre". Merk at denne ikke er en ArrayList ArrayList<String> list2 = new ArrayList<String>(Arrays.asList("en", "to", "tre")); // lager en ny liste med elementene "en", "to" og "tre" (kopiert fra en ikke-modifisertbar liste) |
...
ArrayList kan inneholde alle typer objekter, men ikke enkle datatyper som boolean, int, double, char osv. Dette er en generell begrensning ved alle klasse som kan spesialiseres med <type>-notasjonen, og ArrayList "arver" har også denne begrensningen. Løsningen er å bruke de tilsvarende verdi-klassene Boolean, Integer, Double, Character osv. Fordi Java stort sett håndterer å blande bruk av enkle verdier og instanser av disse klassene, så er ikke ulempen så stor. F.eks. er følgende kode tillatt:
...
ArrayList er en dynamisk liste og har metoder for å legge til på slutten av lista, legg til hvor som helst inni lista, endre enkelt-elementer og fjerne dem. Dersom man fjerner et element i midten av listen, vil de påfølgende elementene forflyttes én plass forover i listen, slik at det til enhver tid ikke er huller i listen. Følgende kodesnutt illustrerer hvordan get, add og remove-metodene virker:
Code Block | ||
---|---|---|
| ||
ArrayList<String>List<String> list = new ArrayList<String>(Arrays.asList("A", "B", "C", "D")); // ny liste med elementene "A", "B", "C" og "D" list.add("E"); // legg til "E" på slutten System.out.println(list + "\n" + list.get(2)); list.remove("C"); // fjerne første forekomst av "C" System.out.println(list + "\n" + list.get(2)); list.add(1, "F"); // legg til "F" på index 1 (0 er første element, 1 andre osv.) System.out.println(list + "\n" + list.get(2)); list.add("A"); // legg til "A" på slutten System.out.println(list + "\n" + list.get(2)); list.remove("A"); // fjern første forekomst av "A" (den som ble lagt til på slutten blir igjen) System.out.println(list + "\n" + list.get(2)); |
...
ArrayList har innebygget støtte for iterasjon ved hjelp av foreach-varianten av for-løkka, så der er svært enkelt å gå gjennom alle elementene i en ArrayList. Denne kodesnutten vil telle opp antall String-objekter som begynner med A:
Code Block | ||
---|---|---|
| ||
ArrayList<String>List<String> list = ... int count = 0; for (String s: list) { if (s.startsWith("A")) { count = count + 1; // eller count++ eller count += 1 } } // count er nå lik antall String-objekter i list som begynner med "A" |
Nyttige metoder
ArrayListList-objektet har grensesnittet definerer mange metoder, hvor vi her gir som ArrayList nødvendigvis implementerer. Her gir vi en kort beskrivelse av de mest brukte. Her brukes <type> for å angi typen som ArrayList List-objektet er spesialisert til å håndtere.
...
Typisk bruk av ArrayList
Den typiske bruken av List og ArrayList er for å implementere 1-n-assosiasjoner, dvs. at et objekt av klasse A skal kunne kobles til ett eller flere objekter av klasse B. A vil da typisk ha et felt av typen ArrayList<B> List<B> og implementere metoder som getBCount(), getB(int), addB(B) og removeB(B) som vil kalle tilsvarende metoder på ArrayList-objektet:
Code Block | ||
---|---|---|
| ||
class A { private ArrayList<B>List<B> bList = new ArrayList<B>(); public int getBCount() { return bList.size(); } public B getB(int indeks) { bList.get(indeks); } public void addB(B b) { bList.add(b); } public void removeB(B b) { bList.remove(b); } } |