Arrays.asList vs new ArrayList (Arrays.asList ())

1. Prehľad

V tomto krátkom návode sa pozrieme na rozdiely medzi nimi Arrays.asList (pole) a ArrayList (Arrays.asList (pole)).

2. Arrays.asList

Začnime s Arrays.asList metóda.

Pomocou tejto metódy môžeme previesť z poľa na pevnú veľkosť Zoznam objekt. Toto Zoznam je iba obal, ktorý sprístupňuje pole ako zoznam. Nie sú kopírované ani vytvárané žiadne údaje.

Tiež nemôžeme upraviť jeho dĺžku, pretože pridávanie alebo odstraňovanie prvkov nie je povolené.

Vo vnútri poľa však môžeme upravovať jednotlivé položky. Všimnite si, že všetky úpravy, ktoré robíme pre jednotlivé položky Zoznam sa prejaví v našom pôvodnom poli:

Reťazec [] stringArray = nový Reťazec [] {"A", "B", "C", "D"}; List stringList = Arrays.asList (stringArray); 

Teraz sa pozrime, čo sa stane, ak upravíme prvý prvok v stringList:

stringList.set (0, "E"); assertThat (stringList) .containsExactly ("E", "B", "C", "D"); assertThat (stringArray) .containsExactly ("E", "B", "C", "D");

Ako vidíme, bolo zmenené aj naše pôvodné pole. Zoznam aj pole teraz obsahujú úplne rovnaké prvky v rovnakom poradí.

Pokúsme sa teraz vložiť nový prvok do stringList:

stringList.add ("F");
java.lang.UnsupportedOperationException na java.base / java.util.AbstractList.add (AbstractList.java:153) na java.base / java.util.AbstractList.add (AbstractList.java:111)

Ako vidíme, pridávanie / odoberanie prvkov do / z priečinka Zoznam bude hádzať java.lang.UnsupportedOperationException.

3. ArrayList (Arrays.asList (pole))

Podobne ako v Arrays.asList metóda, môžeme použiť ArrayList (Arrays.asList (pole)) keď potrebujeme vytvoriť a Zoznam z poľa.

Ale na rozdiel od nášho predchádzajúceho príkladu, toto je nezávislá kópia poľa, čo to znamená zmena nového zoznamu neovplyvní pôvodné pole. Ďalej máme všetky možnosti štamgastu ArrayList, ako pridávanie a odstraňovanie prvkov:

Reťazec [] stringArray = nový Reťazec [] {"A", "B", "C", "D"}; Zoznam stringList = nový ArrayList (Arrays.asList (stringArray)); 

Teraz poďme upraviť prvý prvok z stringList:

stringList.set (0, "E"); assertThat (stringList) .containsExactly ("E", "B", "C", "D");

A teraz sa pozrime, čo sa stalo s našim pôvodným poľom:

assertThat (stringArray) .containsExactly ("A", "B", "C", "D");

Ako vidíme, naše pôvodné pole zostáva nedotknuté.

Predtým, ako sa pozrieme na zdrojový kód JDK, môžeme vidieť Arrays.asList metóda vracia typ ArrayList to je iné ako java.util.ArrayList. Hlavný rozdiel je v tom, že vrátené ArrayList zalomí iba existujúce pole - neimplementuje pridať a odstrániť metódy.

4. Záver

V tomto krátkom článku sme sa pozreli na rozdiely medzi dvoma spôsobmi premeny poľa na ArrayList. Videli sme, ako sa tieto dve možnosti správajú, a rozdiel medzi tým, ako implementujú svoje vnútorné polia.

Ako vždy, vzorky kódu nájdete na GitHub.