快速业务通道

Java集合框架使用注意事项(一, List) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

Java集合框架使用注意事项(一, List)

时间:2010-12-17

List的有用实现

1.ArrayList

2.LinkedList

3.Vector

4.Stack

讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)

ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。

LinkedList是基于链表实现的,所以它生来就是为了频繁插入与删除对象。

讨论2:特殊功能

Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。

不同的是Stack继承自Vector,也就是说它也是基于数组实现的。

讨论3:内存占用

基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里,

这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。

讨论4:同步问题

Vector与Stack生来就是同步的,而ArrayList与LinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List。

从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的remove、add、set

方法来添加或更改List元素,如果在迭代的同时,在其他线程中从结构上修改了List(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改),快速失败迭代器会尽最大努力抛出ConcurrentModificationException。

讨论5:使用策略

如果数据被从数据源提取,数据量不确定,该数据一经被提取后就几乎不会再添加或删除,那么应该建立一个LinkedList来保存从数据源中取出的数据,然后将该LinkedList转换成ArrayList来优化遍历操作。反过来,数据量确定的数据从数据源取出可以先建立一个ArrayList来保存,根据需要如需频繁增删,就转换为LinkedList,如频繁遍历就不需转换。

转换的方法就是使用对应的List类来封装目标List对象。如

ArrayList al = new ArrayList();

LinkedList ll = new LinkedList(al);

同理反过来也可以

LinkedList ll = new LinkedList();

ArrayList al = new ArrayList(ll);

讨论6:toArray()方法

基于数组实现的List会直接返回一个底层数组的拷贝(使用了System.arraycopy方法),基于链表实现的List会新生成一个数组。

讨论7:不可修改

通过使用Collections.unmodifiableList(List list)来生成一个不可修改的List,试图修改返回的列表,不管是直接修改还是通过其迭代器进行修改,都将导致抛出UnsupportedOperationException。

讨论8:遍历器

请尽量使用Iterator,Enumeration已不被鼓励使用。

最后,请参考java.util.Collections类,该类提供了很多有用的操纵集合对象的方法。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号