Java集合框架——List下ArrayList、Vector、LinkedList的简单分析

Java集合框架中,List接口下的常用实现类有ArrayList、Vector、LinkedList,最近学习中遇到了ArrayList和Vector的使用选择,翻阅了部分资料后对这三个List的实现类进行了简单的分析,许多也是老生常谈的,但如有不足望指教。

1、底层实现:

(1).ArryList和Vector使用数组存储数据,其内部数组容量一般大于要存储的数据量,以便于插入或移动元素;所以ArrayList和Vector的索引遍历较快,而插入删除较慢;

      (2).LinkedList底层使用双向链表来实现,则对该类集合的插入与删除操作较快,而按照索引遍历较慢;

      (3).当元素量超过存储空间最大量,需要增长空间时,ArrayList增长50%,Vector增长50%;而LinkedList由于使用双向链表存储数据,所以没有空间增长(所以这三个集合存储方式都是可变长度的);

2、多线程同步:

(1).Vector对List的所有实现方法均进行了同步操作(synchronized),所以Vector是多线程安全的;ArrayList和LinkedList则没有进行同步,并不是多线程安全的;但是可以通过如下方法获取到一个同步的ArrayList集合:

		List<String> li =  Collections.synchronizedList(new ArrayList<String>());
		li.add("Hello");
		li.add("World");
		System.out.println(li);
继承自Vector的Stack也是同步的;所以在单线程情况下,为了提高效率,应当使用ArrayList;从别的地方也听到过“非官方的推荐使用ArrayList而不是Vector”,也是因为Vector同步了所有方法,这并不是必须的,反而有可能降低效率;
(2).由于ArrayList和LinkedList是不同步的,所以其上的迭代器是快速失败的,并会尽最大努力抛出异常ConcurrenModifyException(来自JDK1.6);

此处我对与快速失败的理解是:在多线程环境下,一个线程修改了List的底层存储的结构(对ArrayList增删导致的ArrayList.size的改变,或者对LinkedList的增删导致的链表结构变化),任何正在使用该List迭代器进行遍历的线程中,迭代器都会立即停止且立即返回,并尽最大努力抛出异常;

而对于尽最大努力抛出异常,我的理解是,在迭代器快速失败的情况下,如果有迭代器无法处理的异常信息则迭代器会抛出,但是该异常是否处理则由上层异常处理机制处理;(这两个概念真的无法明白,希望能有人告诉我到底具体是啥意思)

除了使用Collections.synchronizedList(List list)来获得同步集合之外,还可以使用Collections.unmodifiableList(List list)方法来得到一个不可修改的集合,这种方式得到的集合,不论是直接通过集合对象修改其结构还是通过迭代器修改结构,都会立即抛出UnsupportedOperationException异常;这样的集合如果里面没有数据的话感觉应该没什么效果,但是我觉得用在getter方法里的返回值,可以防止外部代码修改不希望修改的值;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值