Arrays.asList vs novi ArrayList (Arrays.asList ())

1. Pregled

U ovom kratkom uputstvu pogledat ćemo razlike između Arrays.asList (niz) i ArrayList (Arrays.asList (niz)).

2. Nizovi.asList

Počnimo s Nizovi.asList metoda.

Pomoću ove metode možemo pretvoriti iz niza u fiksnu veličinu Popis objekt. Ovaj Popis je samo omot koji čini niz dostupnim kao popis. Podaci se ne kopiraju ili stvaraju.

Također, ne možemo mijenjati njegovu duljinu jer dodavanje ili uklanjanje elemenata nije dopušteno.

Međutim, možemo mijenjati pojedinačne stavke unutar polja. Imajte na umu da svi izmjene koje izvršavamo na pojedinačnim stavkama Popis odrazit će se na našem izvornom nizu:

String [] stringArray = new String [] {"A", "B", "C", "D"}; Popis stringList = Arrays.asList (stringArray); 

Pogledajmo što će se dogoditi ako izmijenimo prvi element stringList:

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

Kao što vidimo, i naš je izvorni niz izmijenjen. I popis i niz sadrže potpuno iste elemente u istom redoslijedu.

Pokušajmo sada umetnuti novi element u 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)

Kao što vidimo, dodavanje / uklanjanje elemenata u / iz Popis bacit će java.lang.UnsupportedOperationException.

3. ArrayList (Arrays.asList (niz))

Slično kao Nizovi.asList metoda, možemo koristiti ArrayList (Arrays.asList (niz)) kada trebamo stvoriti a Popis izvan niza.

Ali, za razliku od našeg prethodnog primjera, ovo je neovisna kopija niza, što znači da izmjena novog popisa neće utjecati na izvorni niz. Uz to imamo sve mogućnosti redovnog ArrayList, poput dodavanja i uklanjanja elemenata:

String [] stringArray = new String [] {"A", "B", "C", "D"}; Popis stringList = novi ArrayList (Arrays.asList (stringArray)); 

Sada izmijenimo prvi element stringList:

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

A sada, da vidimo što se dogodilo s našim izvornim nizom:

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

Kao što vidimo, naš izvorni niz ostaje netaknut.

Prije nego što završimo, ako pogledamo izvorni kod JDK, možemo vidjeti Nizovi.asList metoda vraća vrstu ArrayList koja se razlikuje od java.util.ArrayList. Glavna razlika je u tome što se vratio ArrayList samo obavija postojeći niz - ne implementira dodati i ukloniti metode.

4. Zaključak

U ovom smo kratkom članku pogledali razlike između dva načina pretvaranja niza u ArrayList. Vidjeli smo kako se te dvije opcije ponašaju i razliku između načina na koji implementiraju svoje unutarnje nizove.

Kao i uvijek, uzorci koda mogu se naći na GitHubu.