java.util.Arrays$ArrayList 的陷阱

我们 看下 Arrays.java 源码:

http://Arrays.java

 public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        //...

    }

ArrayList是 Arrays 的一个内部类, 注意和 独立的 java . util .ArrayList 区分开。

http://arrays.java/

eclipse-javadoc:☂=TestJVM/E:\/java8\/jre\/lib\/endorsed\/rt_debug.jar

eclipse-javadoc:☂=TestJVM/E:\/java8\/jre\/lib\/endorsed\/rt_debug.jar


The method Arrays.asList 将返回 java.util.Arrays$ArrayList 对象:

 List<String> list = Arrays.asList("1", "2", "3", "4", "5");
 System.out.println(list.getClass()); // class java.util.Arrays$ArrayList

UnsupportedOperationException

如果我们修改一个不可变列表(java.util.Arrays$ArrayList),它会抛出UnsupportedOperationException。

 // immutable list
  List<String> list = Arrays.asList("1", "2", "3", "4", "5");
  list.remove("3");

输出

Exception in thread "main" java.lang.UnsupportedOperationException: remove
    at java.base/java.util.Iterator.remove(Iterator.java:102)
    at java.base/java.util.AbstractCollection.remove(AbstractCollection.java:299)

由于java.util.Arrays$ArrayList 没有实现remove , 只能调用 父类 AbstractList 的remove,源码如下:

  public E remove(int index) {
        throw new UnsupportedOperationException();
    }

支付宝打赏 微信打赏

如果文章对您有帮助,您可以鼓励一下作者