Sprievodca zoznamom Java ArrayList

1. Prehľad

V tomto článku sa pozrieme na to ArrayList triedy z Java Collections Framework. Rozoberieme jeho vlastnosti, bežné prípady použitia, ako aj jeho výhody a nevýhody.

ArrayList sa nachádza v Java Core Libraries, takže nepotrebujete žiadne ďalšie knižnice. Ak ho chcete použiť, pridajte nasledujúci príkaz na import:

import java.util.ArrayList;

Zoznam predstavuje usporiadanú postupnosť hodnôt, pri ktorých sa určitá hodnota môže vyskytnúť viackrát.

ArrayList je jedným z Zoznam implementácie postavené na vrchole poľa, ktoré je schopné dynamicky rásť a zmenšovať sa pri pridávaní / odoberaní prvkov. K prvkom je ľahký prístup pomocou ich indexov začínajúcich od nuly. Táto implementácia má nasledujúce vlastnosti:

  • Náhodný prístup trvá O (1) čas
  • Pridanie prvku trvá amortizovaný konštantný čas O (1)
  • Vkladanie / mazanie trvá O (n) čas
  • Hľadanie trvá O (n) čas pre netriedené pole a O (log n) za triedený

2. Vytvorte ArrayList

ArrayList má niekoľko konštruktérov a všetkých ich v tejto časti predstavíme.

Najskôr si to všimnite ArrayList je generická trieda, takže ju môžete parametrizovať ľubovoľným typom, ktorý chcete, a kompilátor zabezpečí, že napríklad nebudete môcť dať Celé číslo hodnoty v zbierke Struny. Pri načítaní prvkov z kolekcie tiež nemusíte prenášať prvky.

Po druhé, osvedčeným postupom je používať všeobecné rozhranie Zoznam ako typ premennej, pretože ju oddeľuje od konkrétnej implementácie.

2.1. Predvolený konštruktor No-Arg

Zoznam zoznam = nový ArrayList (); assertTrue (list.isEmpty ());

Jednoducho vytvárame prázdny údaj ArrayList inštancia.

2.2. Konštruktér prijíma počiatočnú kapacitu

Zoznam zoznam = nový ArrayList (20);

Tu určíte počiatočnú dĺžku základného poľa. To vám môže pomôcť vyhnúť sa zbytočnému zmeneniu veľkosti pri pridávaní nových položiek.

2.3. Konštruktér prijíma Zbierka

Číslo zbierky = IntStream.range (0, 10) .boxed (). Collect (toSet ()); Zoznam zoznam = nový ArrayList (čísla); assertEquals (10, list.size ()); assertTrue (numbers.containsAll (list));

Všimnite si, že tento prvok Zbierka inštancie sa používajú na vyplnenie základného poľa.

3. Pridajte prvky do ArrayList

Element môžete vložiť na koniec alebo na konkrétne miesto:

Zoznam zoznam = nový ArrayList (); list.add (1L); list.add (2L); list.add (1, 3L); assertThat (Arrays.asList (1L, 3L, 2L), equalTo (zoznam));

Môžete tiež vložiť kolekciu alebo niekoľko prvkov naraz:

Zoznam zoznam = nový ArrayList (Arrays.asList (1L, 2L, 3L)); LongStream.range (4, 10) .boxed () .collect (collectAndThen (toCollection (ArrayList :: new), ys -> list.addAll (0, ys))); assertThat (Arrays.asList (4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo (zoznam));

4. Iterujte cez ArrayList

K dispozícii sú dva typy iterátorov: Iterátor a ListIterator.

Zatiaľ čo prvé vám dáva možnosť prechádzať zoznamom jedným smerom, druhé vám umožňuje prechádzať ho oboma smermi.

Tu vám ukážeme iba ListIterator:

Zoznam zoznam = nový ArrayList (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); ListIterator it = list.listIterator (list.size ()); Výsledok zoznamu = nový ArrayList (list.size ()); while (it.hasPrevious ()) {result.add (it.previous ()); } Zbierky.Reverzný (zoznam); assertThat (result, equalTo (zoznam));

Elementy môžete tiež vyhľadávať, pridávať alebo odstraňovať pomocou iterátorov.

5. Vyhľadajte ArrayList

Ukážeme, ako funguje vyhľadávanie pomocou zbierky:

Zoznam zoznamu = LongStream.range (0, 16) .boxed () .map (Long :: toHexString) .collect (toCollection (ArrayList :: new)); List stringsToSearch = new ArrayList (list); stringsToSearch.addAll (zoznam);

5.1. Vyhľadávanie v netriedenom zozname

Aby ste našli prvok, ktorý môžete použiť indexOf () alebo lastIndexOf () metódy. Obaja prijmú predmet a vrátia sa int hodnota:

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

Ak chcete nájsť všetky prvky vyhovujúce predikátu, môžete filtrovať kolekciu pomocou Java 8 Stream API (viac informácií nájdete tu) pomocou Predikát Páči sa ti to:

Set matchingStrings = new HashSet (Arrays.asList ("a", "c", "9")); Výsledok zoznamu = stringsToSearch .stream () .filter (matchingStrings :: contains) .collect (toCollection (ArrayList :: new)); assertEquals (6, result.size ());

Je tiež možné použiť a pre slučka alebo iterátor:

Iterátor it = stringsToSearch.iterator (); Set matchingStrings = new HashSet (Arrays.asList ("a", "c", "9")); Výsledok zoznamu = nový ArrayList (); while (it.hasNext ()) {Reťazec s = it.next (); if (matchingStrings.contains (s)) {result.add (s); }}

5.2. Vyhľadávanie v zoradenom zozname

Ak máte zoradené pole, môžete použiť binárny vyhľadávací algoritmus, ktorý funguje rýchlejšie ako lineárne vyhľadávanie:

Kópia zoznamu = nový ArrayList (stringsToSearch); Zbierky.sort (kópia); int index = Collections.binarySearch (copy, "f"); assertThat (index, nie (equalTo (-1)));

Všimnite si, že ak sa prvok nenájde, vráti sa -1.

6. Odstráňte prvky z ArrayList

Ak chcete odstrániť prvok, mali by ste nájsť jeho index a až potom vykonať odstránenie pomocou odstrániť () metóda. Preťažená verzia tejto metódy, ktorá prijíma objekt, vyhľadáva ho a odstraňuje prvý výskyt rovnakého prvku:

Zoznam zoznam = nový ArrayList (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); Zbierky.Reverzný (zoznam); zoznam.odstrániť (0); assertThat (list.get (0), equalTo (8)); list.remove (Integer.valueOf (0)); assertFalse (list.contains (0));

Buďte však opatrní pri práci s krabicovými typmi ako napr Celé číslo. Ak chcete odstrániť konkrétny prvok, mali by ste najskôr označiť políčko int hodnota alebo inak, prvok bude odstránený pomocou jeho indexu.

Môžete tiež použiť vyššie uvedené Stream API na odstránenie viacerých položiek, ale tu to neukážeme. Na tento účel použijeme iterátor:

Set matchingStrings = HashSet (Arrays.asList ("a", "b", "c", "d", "e", "f")); Iterátor it = stringsToSearch.iterator (); while (it.hasNext ()) {if (matchingStrings.contains (it.next ())) {it.remove (); }}

7. Zhrnutie

V tomto rýchlom článku sme sa pozreli na ArrayList v Jave.

Ukázali sme, ako vytvoriť ArrayList napríklad ako pridať, nájsť alebo odstrániť prvky pomocou rôznych prístupov.

Ako obvykle nájdete všetky ukážky kódu na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found