(数组)列出Java中的实现

时间:2018-12-12 02:26:30

标签: java arrays collections

有关数组列表实现的问题:

我的代码

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

出了什么问题?

4 个答案:

答案 0 :(得分:4)

Arrays.asList返回一个固定大小的数组,该数组是AbstractList的直接子类,并且显然不支持addremove函数。

如果您打算稍后执行Arrays.asListadd功能,可以尝试使用ArrayList而不是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

答案 1 :(得分:2)

Array.asList返回一个不能完全修改的集合。要添加或删除元素,可以使用ArrayList构造函数,该构造函数接受Collection来包装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

答案 2 :(得分:1)

从数组转换为集合对象时。即基于数组的API到基于集合的API,那么它将为您提供固定大小的集合对象,因为数组的行为具有固定大小。

  

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

提取样品以进行构象。

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)。因此,它从继承中执行抛出UnsupportedOperationException的超类add()函数。

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());

答案 3 :(得分:0)

  

在ArrayList的构造函数中传递数组。例如:

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