A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-7-23 17:01 编辑

用集合框架工具类中的Collections.toArray()将集合变成数组后对其进行了限制(不能进行增删)
但是通过
List<Integer> list=Arrays.asList(arr);将数组变成了集合,就应该有集合的特性,但是为什么java不能对其进行增删操作
求帮助,求救!!

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
API上有说明:
public static <T> List<T> asList(T... a)
返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。

红色字体的文字可以看出,asList并不是将一个数组变成集合,而是获取到该数组的一个映射关系,也就是说使用一个集合来表示这个数组,这是对这个集合的操作,就相当于对数组的操作,由于JAVA中的数组长度是固定不变的,所以如果使用集合的增删方法,会使数组的长度发生改变,所以不可以进行增删操作。

简单的说,asList方法只是让操作者以集合的思想去操作数组,最后操作的仍然是数组,而不是集合。

希望对楼主有所帮助。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我今天也看了这个,我是这样理解的:
List<Integer> list=Arrays.asList(arr);将数组变成了集合。只是将映射关系加到了集合中,而其实际操作还是和数组产生联系了,而数组是不可以增删的,所以java中也就不可以对这方法进行增删操作了。
回复 使用道具 举报
。。。我想说的和楼上差不多。。、
回复 使用道具 举报
  1. public static <T> List<T> asList(T... a) {
  2.         return new ArrayList<>(a);
  3.     }

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

  12.         ArrayList(E[] array) {
  13.             if (array==null)
  14.                 throw new NullPointerException();
  15.             a = array;
  16.         }

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

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

  23.         public <T> T[] toArray(T[] a) {
  24.             int size = size();
  25.             if (a.length < size)
  26.                 return Arrays.copyOf(this.a, size,
  27.                                      (Class<? extends T[]>) a.getClass());
  28.             System.arraycopy(this.a, 0, a, 0, size);
  29.             if (a.length > size)
  30.                 a[size] = null;
  31.             return a;
  32.         }

  33.         public E get(int index) {
  34.             return a[index];
  35.         }

  36.         public E set(int index, E element) {
  37.             E oldValue = a[index];
  38.             a[index] = element;
  39.             return oldValue;
  40.         }

  41.         public int indexOf(Object o) {
  42.             if (o==null) {
  43.                 for (int i=0; i<a.length; i++)
  44.                     if (a[i]==null)
  45.                         return i;
  46.             } else {
  47.                 for (int i=0; i<a.length; i++)
  48.                     if (o.equals(a[i]))
  49.                         return i;
  50.             }
  51.             return -1;
  52.         }

  53.         public boolean contains(Object o) {
  54.             return indexOf(o) != -1;
  55.         }
  56.     }
复制代码
这是源码,可以知道 Arrays 中 asList 方法返回的是 ArrayList 类型的对象,但是这个 ArrayList 类型是 Arrays 中的成员内部类,它只是扩展了 AbstractArrayList 类,从  AbstractArrayList 类的源码可以知道,该类不支持 add 和 remove 方法,调用这两个方法会抛出异常 UnsupportedOperationException();

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马