(Array) Список реализаций в Java - PullRequest
0 голосов
/ 12 декабря 2018

Проблема с реализацией списка массивов:

Мой код

List<Integer> arrayList=new ArrayList<Integer>(3);
arrayList=Arrays.asList(10,20);
System.out.println(arrayList.size());
//arrayList.add(30);
System.out.println(arrayList.size());

Я получаю unsupportedException at line 4

В чем проблема?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Array.asList возвращает коллекцию, которая не является полностью изменяемой.Чтобы добавить или удалить элементы, вы можете использовать конструктор ArrayList, который принимает коллекцию для переноса коллекции, возвращенной Arrays.asList.

List<Integer> arrayList = new ArrayList(Arrays.asList(10,20));
System.out.println(arrayList.size()); //2
arrayList.add(30);
System.out.println(arrayList.size()); //3
0 голосов
/ 12 декабря 2018

Когда вы конвертируете из массива в коллекционный объект.то есть, на основе массива для API на основе коллекции, то он предоставит вам объект коллекции фиксированного размера, потому что поведение массива имеет фиксированный размер.

java.util.Arrays.asList (T... а)

Образцы соусов для конформации.

public class Arrays {
    public static <T> List<T> asList(T... a) {
        return new java.util.Arrays.ArrayList.ArrayList<>(a); // Arrays Inner Class ArrayList
    }
    //...
    private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
        //...
    }
}
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
}

Форма above Source Вы можете заметить, что класс java.util.Arrays.ArrayList не @Override add(index, element), set(index, element), remove(index).Таким образом, из наследования он выполняет функцию суперкласса add(), которая выдает UnsupportedOperationException.

Поскольку AbstractList<E> является абстрактным классом, он обеспечивает реализацию iterator() and listIterator(), так что мы можемперебрать объект списка.

List<String> list_of_Arrays = Arrays.asList(new String[] { "a", "b" ,"c"});

try {
    list_of_Arrays.add("Yashwanth.M");
} catch(java.lang.UnsupportedOperationException e) {
    System.out.println("List Interface executes AbstractList add() fucntion which throws UnsupportedOperationException.");
}
System.out.println("Arrays → List : " + list_of_Arrays);

Iterator<String> iterator = list_of_Arrays.iterator();
while (iterator.hasNext()) System.out.println("Iteration : " + iterator.next() );

ListIterator<String> listIterator = list_of_Arrays.listIterator();
while (listIterator.hasNext())    System.out.println("Forward  iteration : " + listIterator.next() );
while(listIterator.hasPrevious()) System.out.println("Backward iteration : " + listIterator.previous());
0 голосов
/ 12 декабря 2018

Arrays.asList возвращает массив фиксированного размера, который является прямым подклассом AbstractList и, очевидно, не поддерживает функции add и remove ..

Вы можете попробовать ArrayList вместо Arrays.asList, если вы собираетесь выполнять функции add или remove позже;оба они являются типами List, но имеют разные реализации.

List<Integer> arrayList = new ArrayList<Integer>(3);
Collections.addAll(arrayList, 10, 20);
System.out.println(arrayList.size()); // size = 2
arrayList.add(30); // OK
System.out.println(arrayList.size()); // size = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...