当前位置: 首页 > 科技观察

你真的知道如何在Java中使用List吗?

时间:2023-03-13 00:09:15 科技观察

List是Java中常用的集合类。关于List接口的实现类有很多。本文将简要介绍ArrayList、LinkedList和Vector的几个关键实现之间的关系和区别。ListList是一个接口,它继承自Collection接口。它代表一个有序队列。当我们讨论List时,通常会将它与Set进行比较。List中的元素可以重复,并且是有序的(这里的顺序是指按照放置的先后顺序存储。如果1、2、3按顺序存储在List中,那么从遍历的顺序列表也是1、2、3)。Set中的元素不能重复,是无序的(从set中遍历出来的数据与放置顺序无关)。下面是Java中集合类的示意图。从中,我们可以大致了解集合类之间的关系。从上图可以看出ArrayList、LinkedList和Vector的区别。ArrayList、LinkedList和Vector都实现了List接口,也就是List的三种实现,所以在用法上非常相似。.它们之间的主要区别体现在不同操作的性能上。后面会详细分析。ArrayListArrayList底层是用数组实现的,ArrayList可以认为是一个可变大小的数组。随着越来越多的元素被添加到ArrayList,它的大小会动态增加。LinkedListLinkedList底层是通过双向链表实现的。所以LinkedList和ArrayList的区别主要是数组和链表的区别。数组中的查询和赋值更快,因为可以通过数组下标直接访问指定位置。链表中的删除和添加速度更快,因为可以直接通过修改链表的指针来进行元素的添加和删除(Java中没有指针,这里可以简单理解为指针。其实,它由Node节点中的变量指定)。因此,LinkedList的增删改查速度要比ArrayList快。但是查询和修改值比较慢。同时LinkedList还实现了Queue接口,所以也提供了offer()、peek()、poll()等方法。VectorVector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。与ArrayList相比,很多方法都是同步的,保证了线程安全。如果你的程序不涉及线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用了synchronized,必然会影响效率)。两者还有一个区别,就是扩张策略不同。第一次创建List时,会有一个初始大小。随着元素不断地添加到List中,当List认为容量不够时,它就会被扩容。默认情况下,Vector自动将原始数组长度加倍,ArrayList增加50%。ArrayList和LinkedList的性能比较使用下面的代码来比较ArrayList和LinkedList中几个主要操作所花费的时间:ArrayListarrayList=newArrayList();LinkedListlinkedList=newLinkedList();//ArrayListaddlongstartTime=System.nanoTime();for(inti=0;i<100000;i++){arrayList.add(i);}longendTime=System.nanoTime();longduration=endTime-startTime;System.out.println("ArrayListadd:"+duration);//LinkedListaddstartTime=System.nanoTime();for(inti=0;i<100000;i++){linkedList.add(i);}endTime=System.nanoTime();duration=endTime-startTime;System.out.println("LinkedListadd:"+duration);//ArrayListgetstartTime=System.nanoTime();for(inti=0;i<10000;i++){arrayList.get(i);}endTime=System.nanoTime();duration=endTime-startTime;System.out.println("ArrayListget:"+duration);//LinkedListgetstartTime=System.nanoTime();for(inti=0;i<10000;i++){linkedList.get(i);}endTime=System.nanoTime();duration=endTime-startTime;System.out.println("LinkedListget:"+duration);//ArrayListremovestartTime=System.nanoTime();for(inti=9999;i>=0;i--){arrayList.remove(i);}endTime=System.nanoTime();duration=endTime-startTime;System.out.println("ArrayListremove:"+duration);//LinkedListremovestartTime=System.nanoTime();for(inti=9999;i>=0;i--){linkedList.remove(i);}endTime=System.nanoTime();duration=endTime-startTime;System.out.println("LinkedListremove:"+duration);结果:ArrayListadd:13265642LinkedListadd:9550057ArrayListget:1543352LinkedListget:85085551ArrayListremove:199961301LinkedListremove:85性能上的差异很明显,LinkedList在添加和删除操作上更快,但在查询上更慢。如何选择如果涉及到多线程,那就选择Vector(当然你也可以使用ArrayList,自己实现同步)。如果不涉及多线程,可以选择LinkedList和ArrayList。LinkedList更适合从中间插入或删除(链表的特性)。ArrayList更适合在末尾进行检索和插入或删除(数组的属性)。【本文为专栏作家霍利斯原创文章,作者微信公众号Hollis(ID:hollishuang)】点此阅读更多本作者好文