【问题标题】:(Array) List implementations in Java(数组)Java 中的列表实现
【发布时间】:2019-05-13 02:19:54
【问题描述】:

数组列表实现的问题:

我的代码

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

有什么问题?

【问题讨论】:

  • 很高兴看到新的贡献者。亚伦的答案是正确的。无论如何,这与弹簧靴无关,所以稍微编辑了这个问题。快乐的学习和编码!做一个关于 Java 基础的教程(我们称之为 Java 核心)。或者最好阅读一本书的封面。

标签: java arrays collections


【解决方案1】:

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

如果您打算稍后执行addremove 功能,您可以尝试ArrayList 而不是Arrays.asList;它们都是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

【讨论】:

  • 由于 OP 确实已经使用了 ArrayList,因此值得强调的是,赋值 arrayList=Arrays.asList(10,20) 用对另一个对象的引用覆盖了对 ArrayList 的引用,因此停止使用 @ 987654334@。所以用Collections.addAll(arrayList, 10, 20)替换arrayList=Arrays.asList(10,20)就可以解决问题了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    由于AbstractList&lt;E&gt; 是一个抽象类,它为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());
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多