CodeGym /Java blog /Tilfældig /Java ArrayList
John Squirrels
Niveau
San Francisco

Java ArrayList

Udgivet i gruppen
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.
Denne mekanisme tillader Java ArrayList (i modsætning til et almindeligt array) at implementere en metode til at tilføje nye elementer. Det er 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. ArrayListved 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)
Som argumenter tager begge disse metoder indekset for den position, hvor du vil indsætte, og en reference til selve objektet. Forskellen er, at indsættelse ved hjælp af set() overskriver den gamle værdi. Indsættelse ved hjælp af add() skifter først med ét alle elementer fra [indeks] til slutningen af ​​arrayet, og tilføjer derefter det angivne objekt i den resulterende tomme position.

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
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION