Java的ArrayList和LinkedList的对比 我就是我 2022-07-13 03:24 126阅读 0赞 # LinkedList和ArrayList的对比 # 老生常谈的问题了,顺便在这里就把LinkedList的优缺点也给讲了。 1. 顺序插入速度ArrayList会比较快,因为ArrayList是基于数组实现的,数组是事先new好的,只要往指定位置塞一个数据就好了;LinkedList则不同,每次顺序插入的时候LinkedList将new一个对象出来,如果对象比较大,那么new的时间势必会长一点,再加上一些引用赋值的操作,所以顺序插入LinkedList必然慢于ArrayList 2. 基于上一点,因为LinkedList里面不仅维护了待插入的元素,还维护了Entry的前置Entry和后继Entry,如果一个LinkedList中的Entry非常多,那么LinkedList将比ArrayList更耗费一些内存 3. 数据遍历的速度,看最后一部分,这里就不细讲了,结论是:使用各自遍历效率最高的方式,ArrayList的遍历效率会比LinkedList的遍历效率高一些. 4. 有些说法认为LinkedList做插入和删除更快,这种说法其实是不准确的: (1)LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址 (2)ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址 所以,如果待插入、删除的元素是在数据结构的前半段尤其是非常靠前的位置的时候,LinkedList的效率将大大快过ArrayList,因为ArrayList将批量copy大量的元素;越往后,对于LinkedList来说,因为它是双向链表,所以在第2个元素后面插入一个数据和在倒数第2个元素后面插入一个元素在效率上基本没有差别,但是ArrayList由于要批量copy的元素越来越少,操作速度必然追上乃至超过LinkedList。 从这个分析看出,如果你十分确定你插入、删除的元素是在前半段,那么就使用LinkedList;如果你十分确定你删除、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList。如果你不能确定你要做的插入、删除是在哪儿呢?那还是建议你使用LinkedList吧,因为一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况;二来插入元素的时候,弄得不好ArrayList就要进行一次扩容,记住,ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作. 最后一点,一切都是纸上谈兵,在选择了List后,有条件的最好可以做一些性能测试,比如在你的代码上下文记录List操作的时间消耗。 # 对LinkedList以及ArrayList的迭代 # ArrayList使用最普通的for循环遍历,LinkedList使用foreach循环比较快,看一下两个List的定义: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable 注意到ArrayList是实现了RandomAccess接口而LinkedList则没有实现这个接口,关于RandomAccess这个接口的作用,看一下JDK API上的说法: ![这里写图片描述][801753-20151202194035424-454630998.png] 为此,我写一段代码证明一下这一点,注意,虽然上面的例子用的Iterator,但是做foreach循环的时候,编译器默认会使用这个集合的Iterator,具体可参见foreach循环原理。测试代码如下: public class TestMain { private static int SIZE = 111111; private static void loopList(List<Integer> list) { long startTime = System.currentTimeMillis(); for (int i = 0; i < list.size(); i++) { list.get(i); } System.out.println(list.getClass().getSimpleName() + "使用普通for循环遍历时间为" + (System.currentTimeMillis() - startTime) + "ms"); startTime = System.currentTimeMillis(); for (Integer i : list) { } System.out.println(list.getClass().getSimpleName() + "使用foreach循环遍历时间为" + (System.currentTimeMillis() - startTime) + "ms"); } public static void main(String[] args) { List<Integer> arrayList = new ArrayList<Integer>(SIZE); List<Integer> linkedList = new LinkedList<Integer>(); for (int i = 0; i < SIZE; i++) { arrayList.add(i); linkedList.add(i); } loopList(arrayList); loopList(linkedList); System.out.println(); } } 复制代码 我截取三次运行结果: ArrayList使用普通for循环遍历时间为6ms ArrayList使用foreach循环遍历时间为12ms LinkedList使用普通for循环遍历时间为38482ms LinkedList使用foreach循环遍历时间为11ms ArrayList使用普通for循环遍历时间为5ms ArrayList使用foreach循环遍历时间为12ms LinkedList使用普通for循环遍历时间为43287ms LinkedList使用foreach循环遍历时间为9ms ArrayList使用普通for循环遍历时间为4ms ArrayList使用foreach循环遍历时间为12ms LinkedList使用普通for循环遍历时间为22370ms LinkedList使用foreach循环遍历时间为5ms 有了JDK API的解释,这个结果并不让人感到意外,最最想要提出的一点是:如果使用普通for循环遍历LinkedList,其遍历速度将慢得令人发指。 [801753-20151202194035424-454630998.png]: /images/20220713/8077a0a672634fd691b40a768247c7e1.png
相关 Java集合框架中的ArrayList和LinkedList性能对比 在Java集合框架中,ArrayList和LinkedList都是常用的动态数组。它们各有特点,适用于不同的场景。 1. ArrayList: - **插入和删除时间**:由 ╰半橙微兮°/ 2024年09月11日 19:45/ 0 赞/ 24 阅读
相关 Java集合框架:ArrayList和LinkedList的对比 在Java中,ArrayList和LinkedList都是常用的数据结构,它们分别属于Java集合框架中的动态数组和双向链表。下面对比一下两者: 1. **存储方式**: ╰+攻爆jí腚メ/ 2024年09月11日 06:00/ 0 赞/ 19 阅读
相关 Java集合框架:ArrayList和LinkedList的对比 在Java集合框架中,ArrayList和LinkedList是两种常用的动态数组实现方式。它们各有特点,适用于不同的场景。 1. ArrayList: - 插入与删除时间复 小灰灰/ 2024年09月10日 22:33/ 0 赞/ 23 阅读
相关 Java集合框架理解不足:ArrayList和LinkedList的对比 在Java集合框架中,ArrayList和LinkedList是两种常用的动态数组。它们各有特点,适用于不同的场景。 1. ArrayList: - **基于索引操作**:可 淩亂°似流年/ 2024年09月05日 16:27/ 0 赞/ 18 阅读
相关 ArrayList和LinkedList性能对比 ArrayList和LinkedList性能对比 ?前言??博客:【无聊大侠hello word】?✍有一点思考,有一点想法,有一点理性!✍✍本文由在下【无聊大侠hel... 小灰灰/ 2024年05月03日 14:34/ 0 赞/ 35 阅读
相关 Java的ArrayList和LinkedList的对比 LinkedList和ArrayList的对比 老生常谈的问题了,顺便在这里就把LinkedList的优缺点也给讲了。 1. 顺序插入速度ArrayList会比较快, 我就是我/ 2022年07月13日 03:24/ 0 赞/ 127 阅读
相关 ArrayList和LinkedList的对比 List数据结构在实际开发中是非常常见的,其中Arraylist和LinkedList又是这种数据结构中最常见的,本篇文章将会从不同角度来记录讲解这两种list的实现方式及优缺 ╰+哭是因爲堅強的太久メ/ 2022年02月20日 10:09/ 0 赞/ 201 阅读
还没有评论,来说两句吧...