黑马程序员技术交流社区
标题:
数组转为列表后不能增删的问题
[打印本页]
作者:
梁志仲
时间:
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
/*
*验证Arrays.asList()方法
总结:jdk1.5以后的新特性,可变参数,直接传递值与传递数组处理的机制不太相同
如果直接传递数组,基本类型数组将被视为一个对象而不会被解析成数组,如果直接
传递参数将能正常解析。因此传递基本类型数组时强烈建议转为其封装类对象的数组
int ->Integer ,long->Long …………。(未对其封装)
还有楼主你那个问题API上直接写明了,是固定大小不能改变的List!至于为什么不能改变,多半是
由于底层是数组支持的,数组的长度是不可改变的,你可以改变数组的长度吗?
*/
import java.util.*;
class ArraysDemo
{
public static void main(String[] args)
{
//验证添加对象
String[] strs = {"er","sdf","sdf"};
//List<String> s = Arrays.asList("er","sdf","sdf");
List<String> s = Arrays.asList(strs);
System.out.println(s.size());//两个结果都是3
//这个说明了如果你装的是对象
//s.remove();结果报异常,API上说:返回一个受指定数组支持的固定大小的列表
//验证添加字符或数字
int[] arr = {1,5,7,4};
int[] arr2 ={54,6};
//char[] chs ={'d','x'};字符也是一样的,直接把数组本身装进去了,
List s1 = Arrays.asList(arr,arr2);
System.out.println(s1.size());//验证传递arr的结果为1!
//如果装两个int数组的话,结果为2,说明你传进去的数组是以数组的形式存的!这是重点
/*
System.out.println(Arrrays.asList(1,5,7,4).size());
//这个结果为4,这个事直接装的四个Integer对象
*/
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2