Java集合框架里ArrayList Vector和LinkedList的区别
2016-04-04 13:21
411 查看
一、Vector和ArrayList
相同点:Vector和ArrayList都是基于储存元素的Object[] array来实现的,是根据索引来访问元素。
不同点:
1)同步性
Vector的方法大部分是同步的,是线程安全的;
而ArrayList的方法不是同步的。
由于线程的同步必然要影响性能,Vector开销就比较大,这样就造成ArrayList比Vector更快些,不过在最新的JVM中,这两个类的速度差别是很小的,几乎可以忽略不计。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。
2)数据增长:
当集合中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小;
ArrayList就有利于节约内存空间。
补充: Hashtable & HashMap
Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。
二、ArrayList和LinkedList区别:
1.ArrayList是实现了基于动态数组的数据结构;LinkedList基于双向循环链表的数据结构。
2.ArrayList的所有数据是在同一个地址上,而LinkedList的每个数据都拥有自己的地址.
3.数据插入 :比如在i节点插入一个新数据
ArrayList:循环到i节点,插入一个新数据,然后把i节点后面的所有的数据的index加1. ->操作多
LinkedList:循环到i节点,把前一个节点的后续链接到新数据,然后把新数据链接到后一个数据就可以了. ->操作少
结论:平均效率LinkedList要好.
!!这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
4.数据删除 :比如删除i节点数据
ArrayList:循环到i节点,然后把i节点后面的所有的数据的index减1. ->操作多
LinkedList:循环到i节点,把前一个节点的后续链接到i节点的后一个数据就可以了. ->操作少
结论:平均效率LinkedList要好.
5.数据查询 :比如查询i节点数据
ArrayList:循环到i节点. ->操作少
LinkedList:循环到i节点. ->操作少,但由于每个数据的地址不一样,查询比如 ArrayList慢.
结论:平均效率 ArrayList要好.
6.数据更新 :比如更新i节点数据
ArrayList:循环到i节点,把数据更新. ->操作少
LinkedList:循环到i节点,把前数据更新. ->操作少,但由于查询速度没有 ArrayList好,所有效率没有 ArrayList好.
结论:平均效率ArrayList要好.
7.查找操作indexOf,lastIndexOf,contains等,两者差不多。
8.随机查找指定节点的操作get,ArrayList速度要快于LinkedList.
这里只是理论上分析,事实上也不一定,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。
9、LinkedList更适用于:没有大规模的随机读取;大量的增加/删除操作
相关文章推荐
- MyEclipse设置自动提示
- Java复习笔记---小随笔---匿名内部类
- java多线程学习(二)
- java集合:ArrayList,Vector, LinkedList的存储性能和特性
- SpringMVC集成Hessian
- java集合:ArrayList和Vector的区别
- 前几天用AnnotationSessionFactoryBean 注解方式代替*.hbm.xml时扫描映射实休文件后报错
- Java邮件发送
- Java的native方法
- Java 集合转换(数组、List、Set、Map相互转换)
- java集合:Collection 和 Collections的区别
- java集合:HashMap和Hashtable的区别
- java线程池的使用
- java中的静态分派与动态分派
- Spring实战-注入Bean属性(二)
- Java并发工具包学习
- java泛型上下限
- Java基础:序列化和反序列化
- 一天一排序之“插入排序(insertSort)”
- Java 数组及其内存管理