黑马程序员技术交流社区

标题: java 泛型 [打印本页]

作者: 王丽    时间: 2011-7-27 12:35
标题: java 泛型
ArrayList,Vector,LinkedList的特性是啥?哪个更快?
作者: 匿名    时间: 2011-7-27 14:41
标题: 特性,速度
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
作者: 詹季春    时间: 2011-7-27 16:15
这标题和内容差别真是。。。。。:L
LinkedList与ArrayList、Vector实现机制完全不同,
ArrayList、Vector内部以数组的形式来保存集合中的元素,,因此随即访问集合中元素上有较好的性能,而LinkedList内部以链表的形式来保存集合中的元素,因此随访问机会中元素的性能较差,但是在插入、删除元素的时候性能非常的不错(只需要改变指针所指的地址就可以),实际上,vector因为实现了线程同步功能,所以各个方面的性能都有所下降了
注意:对于所有基于数组的集合实现,比如ArrayList、Vector,使用随即访问的速度都是比使用Iterator迭代访问就要性能好,因为随即访问会被映射城数组元素的访问

其实我们不比知道ArrayList、和LinkedList之间的差异,因为LinkedList集合不仅提供了List的功能,还额外提供了双向队列、栈的功能,不过在一些非常铭感的地方,可能就需要慎重的选择那个List实现,
---------------------------------各种容器的性能对比---------------------------------
                   实现机制          随即访问排名  迭代操作排名   插入操作排名   删除操作排名
数组          连续内存区保存元素          1         不支持         不支持         不支持
ArrayList    内部以数组保存元素          2           2            2             2
Vector       内部以数组保存元素          3           3            3             3
LinkedList   内部以链表保存元素          4           1             1            1

从上我们可以看出:因为数组是以一块连续的内存来保存所有数组元素的,所以数组在随即访问时候性能最好
1、所以内部以数组作为底层实现的集合在随即访问的时候也较好的性能,、
2、内部以链表的形式作为底层的实现的集合在插入、删除时候有较好的性能
3、在进行迭代操作的时候,以链表作为底层实现的集合也比以数组作为底层实现的集合有很好的性能

从下面程序中我们可以看到这一点:[code=java]package cn.itcast.heima
import java.util.*;
/**
* Description:
*/
public class TestPerformance
{
        public static void main(String[] args)
        {
                //创建一个字符串数组
                String[] tst1 = new String[900000];
                //动态初始化数组元素
                for (int i = 0; i < 40000; i++)
                {
                        tst1 = String.valueOf(i);
                }
                ArrayList al = new ArrayList();
                //将所有数组元素加入ArrayList集合中
                for (int i = 0; i < 900000 ; i++)
                {
                        al.add(tst1);
                }
                LinkedList ll = new LinkedList();
                //将所有数组元素加入LinkedList集合中
                for (int i = 0; i < 900000 ; i++)
                {
                        ll.add(tst1);
                }
                //迭代访问ArrayList集合的所有元素,并输出迭代时间
                long start = System.currentTimeMillis();
                for (Iterator it = al.iterator();it.hasNext() ; )
                {
                        it.next();
                }
                System.out.println("迭代ArrayList集合元素的时间:" + (System.currentTimeMillis() - start));
                //迭代访问LinkedList集合的所有元素,并输出迭代时间
                start = System.currentTimeMillis();
                for (Iterator it = ll.iterator();it.hasNext() ; )
                {
                        it.next();
                }
                System.out.println("迭代LinkedList集合元素的时间:" + (System.currentTimeMillis() - start));
        }
}[/code]
[ 本帖最后由 詹季春 于 2011-07-27  16:18 编辑 ]
作者: 匿名    时间: 2011-7-27 16:22
ArrayList  Vector  LinkeList 都实现了List接口都实现了大小随意可变的功能,ArrayList是非同步的相对来说其速度更快一些,但由于是非同步的数据安全性就没有那么高 ,如果要实现同步可用synchronized关键词实现同步控制。ArraayList是三种List中效率最高的也是最常用的。Vector的操作方法基本与ArrayList相同。只是它是线程同步的因此安全性能更好一些。 LinkeList采用了链表的结构实现List接口。但该类方法与ArraryList相比。LinkeList可是在开头或结尾进行get. remove,insert操作。而ArryaList只可以在前面操作。 LinkeList也是非同步的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2