一、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更适用于:没有大规模的随机读取;大量的增加/删除操作