Hej! I tidligere lektioner dykkede vi dybt ned i arrays og gennemgik almindelige eksempler på at arbejde med arrays. I denne lektion vil vi tage en nærmere gennemgang på Java ArrayList. Generelt er arrays super praktiske. Og, som du allerede har bemærket, kan du gøre meget med dem :) Men arrays har en række mangler.
- Begrænset størrelse. Du skal vide, hvor mange elementer dit array skal indeholde på det tidspunkt, du opretter det. Hvis du undervurderer, så har du ikke plads nok. Overvurder, og arrayet forbliver halvtomt, hvilket også er dårligt. Når alt kommer til alt, tildeler du stadig mere hukommelse end nødvendigt.
- Et array har ikke metoder til at tilføje elementer. Du skal altid udtrykkeligt angive indekset for den position, hvor du vil tilføje et element. Hvis du ved et uheld angiver indekset for en position optaget af en værdi, du har brug for, vil det blive overskrevet.
- Der er ingen metoder til at slette et element. En værdi kan kun "nulstilles".
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Thomas");
cats[1] = new Cat("Behemoth");
cats[2] = new Cat("Lionel Messi");
cats[1] = null;
System.out.println(Arrays.toString(cats));
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
Output: [Cat{name='Thomas'}, null, Cat{name='Lionel Messi'}] Heldigvis er Javas skabere udmærket klar over arrays' fordele og ulemper og skabte derfor en meget interessant datastruktur kaldet Java ArrayList . Når man taler så enkelt som muligt, er en Java ArrayList et "opsuppet" array med en masse nye funktioner.
Sådan opretter du en ArrayList
Det er meget nemt at lave:
ArrayList<Cat> cats = new ArrayList<Cat>();
Nu har vi lavet en liste til opbevaring af Cat- objekter. Bemærk, at vi ikke angiver størrelsen på ArrayList , fordi den kan udvides automatisk. Hvordan er det muligt? Det er faktisk ret simpelt. Det kan måske overraske dig, men ArrayList i Java er bygget oven på et ganske almindeligt array :) Ja, det indeholder et array, og det er der, vores elementer er gemt. Men ArrayList i Java har en speciel måde at arbejde med det array på:
- Når det interne array er udfyldt, opretter ArrayList en ny array internt. Størrelsen af det nye array er størrelsen af det gamle array gange 1,5 plus 1.
- Alle data kopieres fra det gamle array til det nye
- Det gamle array bliver ryddet op af skraldeopsamleren.
add()
metoden
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<Cat>();
cats.add(new Cat("Behemoth"));
}
Nye elementer tilføjes til slutningen af listen. Nu er der ingen risiko for at overfylde arrayet, så denne metode er fuldstændig sikker. ArrayList kan i øvrigt ikke kun finde et objekt ved dets indeks, men også omvendt: den kan bruge en reference til at finde et objekts indeks i ArrayList ! Dette er, hvad indexOf() -metoden er til: Vi sender en reference til det objekt, vi ønsker, og indexOf() returnerer sit indeks:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
int thomasIndex = cats.indexOf(thomas);
System.out.println(thomasIndex);
}
Output: 0 Det er rigtigt. Vores thomas- objekt er faktisk gemt i element 0. Arrays har ikke kun ulemper. De har også ubestridelige fordele. En af dem er muligheden for at søge elementer efter indeks. Fordi vi peger på et indeks, dvs. på en specifik hukommelsesadresse, er det meget hurtigt at søge i et array på denne måde. ArrayList
ved også hvordan man gør det! Get () metoden implementerer dette:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
Cat secondCat = cats.get(1);
System.out.println(secondCat);
}
Output: Cat{name='Behemoth'} Derudover kan du nemt finde ud af, om ArrayList indeholder et bestemt objekt. Dette gøres ved hjælp af ArrayList contains() metoden:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
cats.remove(fluffy);
System.out.println(cats.contains(fluffy));
}
Metoden kontrollerer, om ArrayLists interne array indeholder elementet, og returnerer en boolean (sand eller falsk). Output: falsk Og en anden vigtig ting om indsættelse. ArrayList lader dig bruge et indeks til at indsætte elementer ikke kun i slutningen af arrayet, men hvor som helst. Det har to metoder til dette:
- ArrayList add(int index, Cat element)
- ArrayList sæt (int index, Cat element)
Her er et eksempel:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
System.out.println(cats.toString());
cats.set(0, lionel);// Now we have a list of 2 cats. Adding a 3rd using set
System.out.println(cats.toString());
}
Output: [[Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Behemoth'}] Vi havde en liste med 2 katte . Derefter indsatte vi en anden som element 0 ved hjælp af set() metoden. Som følge heraf er det gamle element blevet erstattet af et nyt.
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
System.out.println(cats.toString());
cats.add(0, lionel);// Now we have a list of 2 cats. Adding a 3rd using add
System.out.println(cats.toString());
}
Og her ser vi, at add() fungerer anderledes. Den flytter alle elementerne til højre og skriver derefter den nye værdi som element 0. Output: [Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Thomas'}, Cat{name='Behemoth'}] For at rydde listen fuldstændigt bruger vi clear()- metoden:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
cats.clear();
System.out.println(cats.toString());
}
Output: [] Alt blev fjernet fra listen. Bemærk i øvrigt: I modsætning til arrays tilsidesætter ArrayList metoden toString() og viser allerede listen korrekt som strenge. Med almindelige arrays skulle vi bruge klassen Arrays til dette. Og siden jeg nævnte Arrays : Java lader dig nemt "skifte" mellem et array og en ArrayList , dvs. konvertere en til en anden. Arrays - klassen har en Arrays.asList()- metode til dette. Vi bruger det til at få indholdet som et array og videregive det til vores ArrayList -konstruktør:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
Cat[] catsArray = {thomas, behemoth, lionel, fluffy};
ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
System.out.println(catsList);
}
Output: [Cat{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Lionel Messi'}, Cat{name='Fluffy'}] Du kan også gå i den modsatte retning: få en matrix fra et ArrayList- objekt. Vi gør dette ved at bruge toArray() metoden:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
Cat[] catsArray = cats.toArray(new Cat[0]);
System.out.println(Arrays.toString(catsArray));
}
Bemærk: vi sendte et tomt array til toArray() -metoden. Dette er ikke en fejl. Inde i ArrayList- klassen er denne metode implementeret på en sådan måde, at passage af et tomt array øger dets ydeevne. Bare husk dette for fremtiden (selvfølgelig kan du sende en række af en bestemt størrelse; det vil også fungere). Åh, om størrelsen. Listens aktuelle størrelse kan findes ved hjælp af size() metoden:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>();
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
System.out.println(cats.size());
}
Det er vigtigt at forstå, at i modsætning til et arrays length- egenskab returnerer ArrayList.size()- metoden det faktiske antal elementer, ikke den oprindelige kapacitet. Vi har trods alt ikke angivet en størrelse, da vi oprettede ArrayList . Du kan dog angive det - ArrayList har en passende konstruktør. Men med hensyn til at tilføje nye elementer, ændrer dette ikke dens adfærd:
public static void main(String[] args) {
ArrayList<Cat> cats = new ArrayList<>(2);// create an ArrayList with an initial capacity of 2
Cat thomas = new Cat("Thomas");
Cat behemoth = new Cat("Behemoth");
Cat lionel = new Cat("Lionel Messi");
Cat fluffy = new Cat ("Fluffy");
cats.add(thomas);
cats.add(behemoth);
cats.add(lionel);
cats.add(fluffy);
System.out.println(cats.size());
}
Konsoludgang: 4 Vi har lavet en liste med 2 elementer, men den udvidede sig stille og roligt, når vi havde brug for det. En anden overvejelse er, at hvis vi opretter en meget lille liste i starten, skal den udvides oftere, hvilket vil bruge nogle ressourcer. Vi har næppe berørt processen med at fjerne elementer fra en ArrayList i denne lektion. Det er selvfølgelig ikke, fordi det faldt os i tankerne. Vi har lagt dette emne ind i en separat lektion, som du vil møde senere :) For at styrke det, du har lært, foreslår vi, at du ser en videolektion fra vores Java-kursus
GO TO FULL VERSION