黑马程序员技术交流社区

标题: 数组转为列表后不能增删的问题 [打印本页]

作者: 梁志仲    时间: 2012-7-23 10:43
标题: 数组转为列表后不能增删的问题
本帖最后由 梁志仲 于 2012-7-23 14:35 编辑

ArrayList al = new ArrayList();
新建的List对象就可以进行增删。

List<String> list = Arrays.asList(arr);
为什么对list增删会反生UnsupportedOperationException ?
底层是什么代码限制了list的元素个数呢?


作者: 包晗    时间: 2012-7-23 11:09
用iterator 来实现
或者ListIterator
来实现 对集合的操作

作者: 王贵朝    时间: 2012-7-23 11:16
iterator不是来遍历的吗?你的意识是说在遍历中实现对集合的操作?
作者: 何旭栋    时间: 2012-7-23 12:09
本帖最后由 何旭栋 于 2012-7-23 12:19 编辑

Arrays.asList()方法创建的ArrayList不是java.util包下ArrayList,而是Arrays的私有内部类中的ArrayList
java.util包ArrayList类和Arrays中的ArrayList内部类都是继承于AbstractList父类

AbstractList类是抽象类,里面的add等对集合增删的方法都是直接抛异常的

java.util包ArrayList类中覆盖AbstractList的add等对集合增删的方法
而ArrayList下的ArrayList并没有覆盖这些方法,使用add等方法时直接调用AbstractList父类的方法,底层操作是数组操作
所以Arrays.asList()生成的集合不能修改长度的
作者: 张凯    时间: 2012-7-23 12:38
ArrayList al = new ArrayList();
这个al对象是用正常方式下创建的List,可以增删内容。
而List<String> list = Arrays.asList(arr);估计这段代码上面还有一句,是用来限制容器大小的,其实List结构按是否可修改也是可以在分为两个类型的,但是collection框架已经有太多的接口类型了,若在对每种接口类型都分出一个unmodifiable类型的接口,那么最后collection框架会更大,对于学习与使用都会需要记住更多的接口。所以我想这样做的关键一点是:统一接口,减少开发人员的负担。Arrays.asList返回的List内容是Array的内容引用。若可以在List中修改,那么怎么同步呢?因为它们有一个本质的区别Array不能自动增大,若允许在List随便增大,则与其相应的Array的内容怎么保证不可修改呢?他们之间有一个阻抗。最后权衡一下,只能让Arrays.asList返回的List不可修改,或者让返回的List与Array之间没有关系,若这样的话,对于那些很大数组来说性能上就会很有影响。
作者: 吴立杰    时间: 2012-7-23 13:18
  1. /*
  2. *验证Arrays.asList()方法
  3. 总结:jdk1.5以后的新特性,可变参数,直接传递值与传递数组处理的机制不太相同
  4.                 如果直接传递数组,基本类型数组将被视为一个对象而不会被解析成数组,如果直接
  5.                 传递参数将能正常解析。因此传递基本类型数组时强烈建议转为其封装类对象的数组  
  6.                 int ->Integer ,long->Long …………。(未对其封装)
  7.         还有楼主你那个问题API上直接写明了,是固定大小不能改变的List!至于为什么不能改变,多半是
  8.         由于底层是数组支持的,数组的长度是不可改变的,你可以改变数组的长度吗?
  9. */
  10. import java.util.*;
  11. class ArraysDemo
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                
  16.                 //验证添加对象
  17.                 String[] strs = {"er","sdf","sdf"};
  18.                 //List<String> s = Arrays.asList("er","sdf","sdf");
  19.                 List<String> s = Arrays.asList(strs);
  20.                 System.out.println(s.size());//两个结果都是3
  21.                 //这个说明了如果你装的是对象
  22.                 //s.remove();结果报异常,API上说:返回一个受指定数组支持的固定大小的列表
  23.                
  24.                 //验证添加字符或数字
  25.                 int[] arr = {1,5,7,4};
  26.                 int[] arr2 ={54,6};
  27.                 //char[] chs ={'d','x'};字符也是一样的,直接把数组本身装进去了,
  28.                 List s1 = Arrays.asList(arr,arr2);
  29.                 System.out.println(s1.size());//验证传递arr的结果为1!
  30.                 //如果装两个int数组的话,结果为2,说明你传进去的数组是以数组的形式存的!这是重点
  31.                 /*
  32.                         System.out.println(Arrrays.asList(1,5,7,4).size());
  33.                         //这个结果为4,这个事直接装的四个Integer对象
  34.                 */
  35.         }
  36. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2