Arrays.asList срещу нов ArrayList (Arrays.asList ())

1. Общ преглед

В този кратък урок ще разгледаме разликите между Arrays.asList (масив) и ArrayList (Arrays.asList (масив)).

2. Arrays.asList

Нека започнем с метода Arrays.asList .

Използвайки този метод, можем да конвертирате от масив с фиксиран размер Списък обект . Този списък е само обвивка, която прави масива достъпен като списък. Не се копират или създават данни .

Също така не можем да модифицираме дължината му, тъй като добавянето или премахването на елементи не е разрешено .

Въпреки това можем да модифицираме единични елементи в масива. Обърнете внимание, че всички модификации, които правим на отделните елементи от Списъка, ще бъдат отразени в оригиналния ни масив :

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

Сега нека видим какво ще се случи, ако променим първия елемент на stringList :

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

Както виждаме, оригиналният ни масив също беше модифициран. И списъкът, и масивът сега съдържат абсолютно едни и същи елементи в същия ред.

Нека сега се опитаме да вмъкнем нов елемент в stringList :

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

Както виждаме, добавянето / премахването на елементи към / от Списъка ще хвърли java.lang.UnsupportedOperationException .

3. ArrayList (Arrays.asList (масив))

Подобно на метода Arrays.asList , можем да използваме ArrayList (Arrays.asList (масив)), когато трябва да създадем Списък от масив .

Но за разлика от предишния ни пример, това е независимо копие на масива, което означава, че модифицирането на новия списък няма да повлияе на оригиналния масив . Освен това имаме всички възможности на обикновен ArrayList, като добавяне и премахване на елементи:

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

Сега нека модифицираме първия елемент на stringList :

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

И сега, нека видим какво се случи с нашия оригинален масив:

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

Както виждаме, оригиналният ни масив остава недокоснат .

Преди да приключим, ако разгледаме изходния код на JDK, можем да видим, че методът Arrays.asList връща тип ArrayList, който е различен от java.util.ArrayList . Основната разлика е, че върнатият ArrayList обгръща само съществуващ масив - той не прилага методите за добавяне и премахване .

4. Заключение

В тази кратка статия разгледахме разликите между два начина за преобразуване на масив в ArrayList . Видяхме как се държат тези две опции и разликата между това как те прилагат своите вътрешни масиви.

Както винаги, примерните кодове могат да бъдат намерени в GitHub.