Vodič za Java ArrayList

1. Pregled

U ovom ćemo članku pogledati ArrayList klase iz Okvira Java Collections. Razgovarat ćemo o njegovim svojstvima, uobičajenim slučajevima korištenja, kao i prednostima i nedostacima.

ArrayList nalazi se unutar Java Core Libraries, tako da vam ne trebaju dodatne knjižnice. Da biste ga koristili, samo dodajte sljedeću izjavu o uvozu:

uvoz java.util.ArrayList;

Popis predstavlja uređeni niz vrijednosti gdje se neka vrijednost može pojaviti više puta.

ArrayList je jedan od Popis implementacije izgrađene na vrhu niza koji može dinamički rasti i smanjivati ​​se dok dodajete / uklanjate elemente. Elementima se lako može pristupiti njihovim indeksima počevši od nule. Ova implementacija ima sljedeća svojstva:

  • Potreban je slučajan pristup O (1) vrijeme
  • Dodavanje elementa traje amortizirano konstantno vrijeme O (1)
  • Umetanje / brisanje traje Na) vrijeme
  • Traženje traje Na) vrijeme za nerazvrstani niz i O (zapisnik n) za razvrstanog

2. Stvorite ArrayList

ArrayList ima nekoliko konstruktora i sve ćemo ih predstaviti u ovom odjeljku.

Prvo, primijetite to ArrayList je generička klasa, tako da je možete parameterizirati s bilo kojom vrstom koju želite, a prevoditelj će osigurati da, na primjer, nećete moći staviti Cijeli broj vrijednosti unutar zbirke Žice. Također, ne trebate emitirati elemente kada ih dohvaćate iz kolekcije.

Drugo, dobra je praksa koristiti generičko sučelje Popis kao tip varijable, jer je odvaja od određene implementacije.

2.1. Zadani konstruktor bez arg

Lista popisa = novi ArrayList (); assertTrue (list.isEmpty ());

Jednostavno stvaramo prazno ArrayList primjer.

2.2. Konstruktor prihvaća početni kapacitet

Lista popisa = novi ArrayList (20);

Ovdje navodite početnu duljinu temeljnog niza. To vam može pomoći da izbjegnete nepotrebno mijenjanje veličine prilikom dodavanja novih stavki.

2.3. Konstruktor prihvaća Kolekcija

Broj zbirke = IntStream.range (0, 10) .boxed (). Collect (toSet ()); Lista popisa = novi ArrayList (brojevi); assertEquals (10, list.size ()); assertTrue (numbers.containsAll (popis));

Obavijest, taj element Kolekcija instance koriste se za popunjavanje temeljnog niza.

3. Dodajte elemente u ArrayList

Možete umetnuti element na kraju ili na određenom položaju:

Lista popisa = novi ArrayList (); list.add (1L); list.add (2L); list.add (1,3 L); assertThat (Arrays.asList (1L, 3L, 2L), jednakTo (popis));

Također možete umetnuti zbirku ili nekoliko elemenata odjednom:

Popis popisa = novi ArrayList (Arrays.asList (1L, 2L, 3L)); LongStream.range (4, 10) .boxed () .collect (collectionAndThen (toCollection (ArrayList :: new), ys -> list.addAll (0, ys))); assertThat (Arrays.asList (4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), jednakTo (popis));

4. Iterati preko ArrayList

Dostupne su dvije vrste iteratora: Iterator i ListIterator.

Dok vam prva daje mogućnost da popis pređete u jednom smjeru, drugi vam omogućuje da ga pređete u oba smjera.

Ovdje ćemo vam pokazati samo ListIterator:

Popis popisa = novi ArrayList (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); ListIterator it = list.listIterator (list.size ()); Rezultat popisa = novi ArrayList (list.size ()); while (it.hasPrevious ()) {result.add (it.previous ()); } Collections.reverse (popis); assertThat (rezultat, jednakTo (popis));

Također možete pretraživati, dodavati ili uklanjati elemente pomoću iteratora.

5. Pretražite ArrayList

Pokazat ćemo kako pretraživanje funkcionira pomoću zbirke:

Popis popisa = LongStream.range (0, 16) .boxed () .map (Long :: toHexString) .collect (toCollection (ArrayList :: new)); Popis stringsToSearch = novi ArrayList (popis); stringsToSearch.addAll (popis);

5.1. Pretraživanje nesvrstanog popisa

Da biste pronašli element koji možete koristiti indexOf () ili lastIndexOf () metode. Oboje prihvate predmet i vrate se int vrijednost:

assertEquals (10, stringsToSearch.indexOf ("a")); assertEquals (26, stringsToSearch.lastIndexOf ("a"));

Ako želite pronaći sve elemente koji udovoljavaju predikatu, zbirku možete filtrirati pomoću Jave 8 Stream API (više o tome pročitajte ovdje) pomoću Predikat kao ovo:

Postavi matchStrings = novi HashSet (Arrays.asList ("a", "c", "9")); Popis rezultata = stringsToSearch .stream () .filter (matchingStrings :: contains) .collect (toCollection (ArrayList :: new)); assertEquals (6, result.size ());

Također je moguće koristiti a za petlja ili iterator:

Iterator it = stringsToSearch.iterator (); Postavi matchStrings = novi HashSet (Arrays.asList ("a", "c", "9")); Rezultat popisa = novi ArrayList (); while (it.hasNext ()) {String s = it.next (); if (matchingStrings.contens (s)) {result.add (s); }}

5.2. Pretraživanje razvrstanog popisa

Ako imate razvrstani niz, tada možete koristiti binarni algoritam pretraživanja koji radi brže od linearnog pretraživanja:

Kopija popisa = novi ArrayList (stringsToSearch); Collections.sort (copy); int index = Collections.binarySearch (kopija, "f"); assertThat (indeks, ne (jednakTo (-1)));

Primjetite da će se, ako element nije pronađen, vratiti -1.

6. Uklonite elemente iz ArrayList

Da biste uklonili element, trebali biste pronaći njegov indeks i tek tada izvršiti uklanjanje putem ukloniti() metoda. Preopterećena verzija ove metode koja prihvaća objekt, traži ga i izvodi uklanjanje prve pojave jednakog elementa:

Popis popisa = novi ArrayList (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); Collections.reverse (popis); list.remove (0); assertThat (list.get (0), jednakTo (8)); list.remove (Integer.valueOf (0)); assertFalse (list.contens (0));

Ali budite oprezni kada radite s boks-vrstama poput Cijeli broj. Da biste uklonili određeni element, prvo trebate okvirirati int vrijednost ili na drugi način, element će se ukloniti njegovim indeksom.

Možete koristiti i gore spomenuto Stream API za uklanjanje nekoliko predmeta, ali ovdje ga nećemo prikazati. U tu svrhu koristit ćemo iterator:

Postavite matchingStrings = HashSet (Arrays.asList ("a", "b", "c", "d", "e", "f")); Iterator it = stringsToSearch.iterator (); while (it.hasNext ()) {if (matchingStrings.contens (it.next ())) {it.remove (); }}

7. Sažetak

U ovom kratkom članku pogledali smo ArrayList u Javi.

Pokazali smo kako stvoriti ArrayList primjerice, kako dodati, pronaći ili ukloniti elemente pomoću različitih pristupa.

Kao i obično, sve uzorke koda možete pronaći na GitHubu.