ArrayList,Vector, LinkedList的存储性能和特性

List 的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack
  
 
 讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)
  ArrayList
Vector都是基于数组实现的,这就说明ArrayListVector适合做遍历而不适合做频繁的插入和删除。
  vector
是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
 
 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,arraylist增长率为目前数组长度的50%.
 
 如过在集合中使用数据量比较大的数据,用vector有一定的优势
  LinkedList
是基于链表实现的,所以它生来就是为了频繁插入与删除对象。
  
 
 讨论2:特殊功能 Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。
 
 不同的是Stack继承自Vector,也就是说它也是基于数组实现的。
  
 
 讨论3:内存占用 基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里,
 
 这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。
  
 
 讨论4:同步问题 VectorStack生来就是同步的,
 
 而ArrayListLinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List
 
 从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的removeaddset
 
 方法来添加或更改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:遍历器 请尽量使用IteratorEnumeration已不被鼓励使用。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值