CodeGym /Java-blogg /Tilfeldig /Java ArrayList
John Squirrels
Nivå
San Francisco

Java ArrayList

Publisert i gruppen
Hei! I tidligere leksjoner gjorde vi et dypdykk i arrays og gjennomgikk vanlige eksempler på arbeid med arrays. I denne leksjonen tar vi en nærmere gjennomgang på Java ArrayList. Generelt er arrays super nyttige. Og, som du allerede har lagt merke til, kan du gjøre mye med dem :) Men arrays har en rekke mangler.
  • Begrenset størrelse. Du må vite hvor mange elementer matrisen din må inneholde når du oppretter den. Hvis du undervurderer, vil du ikke ha nok plass. Overvurder, og matrisen vil forbli halvtom, noe som også er dårlig. Tross alt tildeler du fortsatt mer minne enn nødvendig.

  • En matrise har ikke metoder for å legge til elementer. Du må alltid eksplisitt angi indeksen til posisjonen der du vil legge til et element. Hvis du ved et uhell spesifiserer indeksen for en posisjon som er okkupert av en verdi du trenger, vil den bli overskrevet.

  • Det finnes ingen metoder for å slette et element. En verdi kan bare "nullstilles".

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 + '\'' +
               '}';
   }
}
Utdata: [Cat{name='Thomas'}, null, Cat{name='Lionel Messi'}] Heldigvis er Javas skapere godt klar over fordeler og ulemper med arrays, og laget derfor en veldig interessant datastruktur kalt Java ArrayList . Snakker så enkelt som mulig, en Java ArrayList er en "supped up" matrise med mange nye funksjoner.

Hvordan lage en ArrayList

Det er veldig enkelt å lage:

ArrayList<Cat> cats = new ArrayList<Cat>();
Nå har vi laget en liste for lagring av Cat- objekter. Merk at vi ikke spesifiserer størrelsen på ArrayList , fordi den kan utvides automatisk. Hvordan er dette mulig? Det er ganske enkelt, faktisk. Det kan overraske deg, men ArrayList i Java er bygget på toppen av en helt vanlig array :) Ja, den inneholder en array, og det er der elementene våre lagres. Men ArrayList i Java har en spesiell måte å jobbe med den matrisen på:
  • Når den interne matrisen er fylt, oppretter ArrayList en ny matrise internt. Størrelsen på den nye matrisen er størrelsen på den gamle matrisen ganger 1,5 pluss 1.

  • Alle dataene kopieres fra den gamle matrisen til den nye

  • Den gamle matrisen blir ryddet opp av søppelsamleren.
Denne mekanismen lar Java ArrayList (i motsetning til en vanlig array) implementere en metode for å legge til 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 legges til på slutten av listen. Nå er det ingen risiko for å flyte over matrisen, så denne metoden er helt trygg. Forresten, ArrayList kan ikke bare finne et objekt ved sin indeks, men også omvendt: den kan bruke en referanse for å finne et objekts indeks i ArrayList ! Dette er hva indexOf() -metoden er for: Vi sender en referanse til objektet vi ønsker, og indexOf() returnerer indeksen:

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);
}
Utgang: 0 Det stemmer. Vårt thomas- objekt er faktisk lagret i element 0. Matriser har ikke bare ulemper. De har også ubestridelige fordeler. En av dem er muligheten til å søke i elementer etter indeks. Fordi vi peker på en indeks, dvs. til en spesifikk minneadresse, er det veldig raskt å søke i en matrise på denne måten. ArrayListvet hvordan man gjør det også! 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);
}
Utdata: Cat{name='Behemoth'} I tillegg kan du enkelt finne ut om ArrayList inneholder et bestemt objekt. Dette gjøres ved å bruke 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 sjekker om ArrayLists interne array inneholder elementet, og returnerer en boolsk (sann eller usann). Output: false Og en annen viktig ting om innsetting. ArrayList lar deg bruke en indeks til å sette inn elementer ikke bare på slutten av matrisen, men hvor som helst. Den har to metoder for dette:
  • ArrayList add(int index, Cat-element)
  • ArrayList set (int index, Cat-element)
Som argumenter tar begge disse metodene indeksen til posisjonen der du vil sette inn, og en referanse til selve objektet. Forskjellen er at å sette inn med set() overskriver den gamle verdien. Innsetting ved hjelp av add() skifter først med ett alle elementer fra [indeks] til slutten av matrisen, og legger deretter til det spesifiserte objektet i den resulterende tomme posisjonen.

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());
}
Utdata: [[Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Behemoth'}] Vi hadde en liste med 2 katter . Deretter satte vi inn en annen som element 0 ved å bruke set()- metoden. Som et resultat er det gamle elementet erstattet med et nytt.

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 annerledes. Den flytter alle elementene til høyre og skriver deretter den nye verdien som element 0. Utdata: [Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Thomas'}, Cat{name='Behemoth'}] For å tømme listen fullstendig, bruker 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());
}
Utdata: [] Alt ble fjernet fra listen. Vær forresten oppmerksom på: i motsetning til arrays, overstyrer ArrayList toString() -metoden og viser allerede listen på riktig måte som strenger. Med vanlige arrays måtte vi bruke Arrays- klassen til dette. Og siden jeg nevnte Arrays : Java lar deg enkelt "veksle" mellom en array og en ArrayList , dvs. konvertere en til en annen. Arrays - klassen har en Arrays.asList()- metode for dette. Vi bruker den til å få innholdet som en matrise og sende det til ArrayList- konstruktøren vå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);
}
Utgang: [Cat{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Lionel Messi'}, Cat{name='Fluffy'}] Du kan også gå i motsatt retning: få en matrise fra et ArrayList- objekt. Vi gjør dette ved å bruke 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));
}
Merk: vi sendte en tom matrise til toArray() -metoden. Dette er ikke en feil. Inne i ArrayList- klassen er denne metoden implementert på en slik måte at å sende en tom matrise øker ytelsen. Bare ha dette i bakhodet for fremtiden (selvfølgelig kan du sende en rekke av en bestemt størrelse; det vil også fungere). Å, om størrelsen. Listens gjeldende størrelse kan bli funnet ved å bruke 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 viktig å forstå at i motsetning til en arrays length- egenskap, returnerer ArrayList.size()- metoden det faktiske antallet elementer, ikke den opprinnelige kapasiteten. Tross alt spesifiserte vi ikke en størrelse da vi opprettet ArrayList . Du kan imidlertid spesifisere det - ArrayList har en passende konstruktør. Men når det gjelder å legge til nye elementer, endrer ikke dette oppførselen:

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());
}
Konsollutgang: 4 Vi har laget en liste med 2 elementer, men den utvidet seg stille når vi trengte det. En annen vurdering er at hvis vi oppretter en veldig liten liste i utgangspunktet, vil den måtte utvides oftere, noe som vil bruke noen ressurser. Vi har knapt berørt prosessen med å fjerne elementer fra en ArrayList i denne leksjonen. Dette er selvfølgelig ikke fordi det har mistet tankene våre. Vi har lagt dette emnet inn i en egen leksjon som du vil møte senere :) For å forsterke det du lærte, foreslår vi at du ser en videoleksjon fra Java-kurset vårt
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION