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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢孔营 中级黑马   /  2013-5-28 13:08  /  1279 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 谢孔营 于 2013-5-31 07:57 编辑

例如一个数组:
String[] a = {"adb","cad","sdsd"}
List  list = Arrays.asList(a);
list.add("sd");会发生UnsupportOperationException异常
视频上说是因为,数组的长度固定,所以不能再增加元素
但是数组已经转为集合,既集合的长度是可以自动增长的。
对集合的操作,为什么用数组来解释
该list集合和a数组有啥关系。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
从源码来分析以下:

  1.   /*Arrays.java摘取部分*/

  2. public static <T> List<T> asList(T... a) {
  3.         return new ArrayList<>(a);//---------看下面静态内部类
  4.     }
  5.     private static class ArrayList<E> extends AbstractList<E>//-------它继承了AbstractList但是没有复写add方法
  6.         implements RandomAccess, java.io.Serializable
  7.     {
  8.         private static final long serialVersionUID = -2764017481108945198L;
  9.         private final E[] a;

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

  15.         public int size() {
  16.             return a.length;//----------------集合的长度为固定的,就是数组长度
  17.         }
  18.     }
  19.    
  20.   
  21.    /*AbstractList.java*/
  22.   public boolean add(E e) {
  23.         add(size(), e);
  24.         return true;
  25.     }
  26.   public void add(int index, E element) {
  27.         throw new UnsupportedOperationException();//-------在未被复写的情况下总是抛出异常
  28.     }

  29. 综合以上:当你把数组->集合,它就是个固定长度的集合,而不是功能类似于ArrayList的集合
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
张洪慊 发表于 2013-5-28 13:51
从源码来分析以下:

哥们,真行,懂了,谢了。
回复 使用道具 举报
本帖最后由 w270307032 于 2013-5-28 14:26 编辑

首先,要先明确的是集合(ArayyList)的长度可增长和可变长度数组的原理,都是新建一个新长度的数组,然后把旧的引用指向新的数组。
然后我们来分析下以上代码: Arrays.asList(a); 我们查看API发现该方法的说明是:static <T>   List<T> asList(T... a)  返回一个受指定数组支持的固定大小的列表。
也就是说通过这个方法返回的集合长度是固定的不可变的,所以不能再添加。
那为什么通过这个方法返回的这个集合长度不可变,而其它集合长度可变呢?那我们只能查看原代码了。通过查看原代码发现,该方法的原代码如下:
public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    },于是我们只能再进一步去查看, ArrayList<>(a);这个构造方法的原代码了,这个构造方法的原代码如下:
private final E[] a
ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
            a = array;
        }通过以上代码你就可以看出list底层返回的其实是一个和String[] a一样长度的数组了,也就可以明白为什么是不能再往里添加元素了
至于可变长度数组和集合的实现方法,楼主有兴趣的话可以自己去看下原代码哦,至于该list集合和a数组的关系通过以上原代码 就不用说了吧{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主你好,如果帖子已经没问题了,那么把帖子的类型改为“已解决”。如果不会改看我的个性签名
回复 使用道具 举报
袁梦希 发表于 2013-5-30 10:40
楼主你好,如果帖子已经没问题了,那么把帖子的类型改为“已解决”。如果不会改看我的个性签名 ...

你的个性签名在哪里
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马