`
dreamer_0924
  • 浏览: 180160 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Arrays.asList返回ArrayList并非java.util.ArrayList,调用报 UnsupportedOperationException

阅读更多
调用代码:
String[] tmpIds = ids.split(",");
rt = Arrays.asList(tmpIds);
rt.add(String.valueOf(userId));

Arrays.asList(tmpIds)返回固定大小的list

/**
     * Returns a fixed-size list backed by the specified array.  (Changes to
     * the returned list "write through" to the array.)  This method acts
     * as bridge between array-based and collection-based APIs, in
     * combination with {@link Collection#toArray}.  The returned list is
     * serializable and implements {@link RandomAccess}.
     *
     * 
     *
     * <p>This method also provides a convenient way to create a fixed-size
     * list initialized to contain several elements:
     * <pre>
     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
     * </pre>
     *
     * @param a the array by which the list will be backed
     * @return a list view of the specified array
     */
    public static <T> List<T> asList(T... a) {
        return new ArrayList<T>(a);
    }

注:asList返回固定大小的list,对list中元素的改变将“同步”到原数组。

调用add方法报UnsupportedOperationException异常,实际add方法调用的是java.util.AbstractList<E>的add方法,如下:
 public void add(int index, E element) {
     throw new UnsupportedOperationException();
 }


查考jdk源码如下:
public class Arrays {
//...............
//...............
    public static <T> List<T> asList(T... a) {
        return new ArrayList<T>(a);
    }
//...............
//...............
    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) {
            if (array==null)
                throw new NullPointerException();
	    a = array;
	}

	public int size() {
	    return a.length;
	}

	public Object[] toArray() {
	    return a.clone();
	}

	public <T> T[] toArray(T[] a) {
	    int size = size();
	    if (a.length < size)
		return Arrays.copyOf(this.a, size,
				     (Class<? extends T[]>) a.getClass());
	    System.arraycopy(this.a, 0, a, 0, size);
	    if (a.length > size)
		a[size] = null;
	    return a;
	}

	public E get(int index) {
	    return a[index];
	}

	public E set(int index, E element) {
	    E oldValue = a[index];
	    a[index] = element;
	    return oldValue;
	}

        public int indexOf(Object o) {
            if (o==null) {
                for (int i=0; i<a.length; i++)
                    if (a[i]==null)
                        return i;
            } else {
                for (int i=0; i<a.length; i++)
                    if (o.equals(a[i]))
                        return i;
            }
            return -1;
        }

        public boolean contains(Object o) {
            return indexOf(o) != -1;
        }
    }
//...............
//...............
}

调用报 java.lang.UnsupportedOperationException
分享到:
评论

相关推荐

    浅谈Arrays.asList() 和ArrayList类型区别

    在Java编程中,Arrays.asList()方法和ArrayList是两种不同的方式来处理列表数据,它们之间存在显著的区别。这篇文章将深入探讨这两个概念以及它们在实际使用中的差异。 首先,Arrays.asList()是一个Java内置方法,...

    Java用Arrays.asList初始化ArrayList实例方法

    在 Java 中,使用 Arrays.asList 方法可以快速创建一个 List 集合,但是需要注意的是,这个方法返回的 ArrayList 并不是 java.util.ArrayList 对象,而是一个内部类。下面我们来详细了解这个知识点。 首先,让我们...

    java 源码分析Arrays.asList方法详解

    这里的关键在于,`Arrays.asList()`返回的是一个由`Arrays`类内部定义的`ArrayList`实例,而不是`java.util.ArrayList`。这个内部`ArrayList`实现并不是标准的可变大小的列表,而是固定大小的,这解释了为什么在尝试...

    list转数组.docx

    这是因为这个List实际上是`java.util.Arrays`类中的一个内部静态类`java.util.Arrays.ArrayList`,它不是标准的`java.util.ArrayList`。因此,如果你尝试向这个List中添加元素,如`list.add("1")`,将会抛出`...

    原来Java中有两个ArrayList

    在代码示例中,当尝试将`Arrays.asList()`返回的对象赋值给`java.util.ArrayList`时,编译器会报错,因为它们虽然是同名,但实际上是两个不同的类型。这表明了Java类型系统对类型安全性的严格控制,不能简单地将一个...

    详解Java 集合类 List 的那些坑

    Arrays.asList 方法返回的 List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 java.util.AbstractList,但没有实现 add 方法,默认抛出 java....

    Java如何把数组转换为ArrayList

    然而,需要注意的是,Arrays.asList()方法返回的列表不是java.util.ArrayList,而是java.util.Arrays中的一个私有静态类。这意味着,返回的列表的大小是固定的,无法添加或删除元素,否则将抛出...

    阿里开发规范(集合与并发处理)

    **说明**:`Arrays.asList` 返回的对象实际上是 `java.util.Arrays$ArrayList` 类型,这个类并没有实现集合的修改方法。`Arrays.asList` 实现了适配器模式,它只提供了集合的接口,但底层数据仍然是数组。 **示例**...

    Java集合List与Array的相互转换

    然而,这个List并不是`java.util.ArrayList`,而是`Arrays`类的一个内部匿名类,它实现了`AbstractList`,提供了读取操作,但不支持修改操作,如添加、移除或清空元素。如果尝试调用这些方法,会抛出`...

    迭代大师的修炼之道:Java中Iterator与增强for循环的深度解析

    import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayList&lt;String&gt; names = new ArrayList(); names.add("Ada Lovelace");...

    java集合代码

    ArrayList是Java中`java.util`包下的一个类,它是List接口的一个具体实现。ArrayList基于动态数组,允许我们在列表的任何位置插入和删除元素,提供了快速访问元素的能力。其内部实现通过扩容机制来保证在添加元素时...

    牛客网Java专项50题详解

    - `Arrays.asList()`方法可以将数组转换为`List`对象,但需要注意的是,返回的是`Arrays`类中的静态内部类`ArrayList`的实例,而不是`java.util.ArrayList`。 - 使用该方法创建的`List`是不可变的,试图修改这个`...

    java-collection-all-in-one.pdf

    asList方法是Arrays类的一个静态方法,用于将数组转换为List视图,但它不支持添加、删除或修改操作,因为它们会抛出UnsupportedOperationException异常。ArrayList的复制可以通过构造函数、addAll方法、Collections....

Global site tag (gtag.js) - Google Analytics