在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这:

Java集合(五)--LinkedList源码解读

Java集合(四)--基于JDK1.8的ArrayList源码解读

  这篇文章,对比一下ArrayList和LinkedList和Vector,主要是前面两个,因为Vector很少使用,如果考虑并发安全,也会使用

CopyOnWriteArrayList

ArrayList和LinkedList的对比:插入、修改、删除、遍历

顺序插入add(Object):

  1、ArrayList效率无疑是最好的,elementData[size++] = e;

  2、LinkedList相对而言略逊一筹,因为需要new Node(),如果对象比较大的时候,效率相对而言还是低的

非顺序插入add(index, Object):

  1、ArrayList通过System.arraycopy()方法,把index后面的所有数据都前移一位,如果数据量多,你还要插入到首位,是不是要绝望了。。。

  2、LinkedList无论插入到任何位置,只需要通过index找到node节点(这个过程使用二分法,越靠近中间的数据,效率越低),改变前后指向关系即可

我想,非顺序插入LinkedList效率无疑更好一点,但如果插入的index很靠近尾部,ArrayList肯定更好一点,因为前移的数据量很少了

修改set(index, object):

  1、ArrayList得到index对应value,直接替换即可

  2、LinkedList的消耗还是来自于通过index寻找节点的过程

ArrayList更好一点

删除remove(int):

  1、ArrayList还是需要把index后面的所有数据都前移一位

  2、LinkedList的消耗还是来自于通过index寻找节点的过程

删除remove(Object):

  1、ArrayList首先遍历得到Object对应的index,然后把index后面的所有数据都前移一位

  2、LinkedList首先遍历得到Object对应的index,然后直接改变前后指向关系即可

for循环:

  1、ArrayList使用普通for循环效率最高,而且foreach循环效率没有很大

  2、LinkedList使用Iterator效率最好,普通for循环在大数据量的情况,慢的令人发指

ArrayList使用for循环和LinkedList使用Iterator进行遍历,前者效率稍高

综上:

  ArrayList适合顺序插入或者靠近尾部的插入,修改,而且可能发生扩容,效率会降低

  LinkedList适合非顺序插入,特别是靠近两端的位置,但是如果很靠近尾部,ArrayList的效率不会比LinkedList低,没有扩容的概念

删除方面:

  ArrayList寻址比较快,而数据迁移效率比较低

  LinkedList寻址比较慢,但是只需要改变前后指向关系

至于修改:

  肯定是ArrayList效率更高的

Java集合(六)--ArrayList、LinkedList和Vector对比的更多相关文章

  1. Javase之集合体系(2)之List及其子类ArrayList,LinkedList与Vector及其迭代器知识

    集合体系之List及其子类ArrayList,LinkedList与Vector及其迭代器知识 List(接口) 特点:有序(存储与取出顺序相同),可重复 List子类特点: ​ ArrayList: ...

  2. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

  4. java集合系列之LinkedList源码分析

    java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...

  5. 从源码看Java集合之ArrayList

    Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int ...

  6. java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

    说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...

  7. java 集合之ArrayList、Vector、LinkedList、CopyOnWriteArrayList

    ArrayList 线程不安全. 底层Object[]数组实现,用transient关键字修饰,防止序列化,然后重写了readObject和writeObject方法,为了提高传输效率. 插入时会判断 ...

  8. List集合与Set集合(ArrayList,LinkedList,Vector,HashSet,LinkedHashSet,可变参数)

    List集合介绍及常用方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* java. ...

  9. Java集合之ArrayList和LinkedList的实现原理以及Iterator详解

    ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...

随机推荐

  1. 监听屏幕旋转事件window. onorientationchange

    // 判断屏幕是否旋转 function orientationChange() { switch(window.orientation) { case 0: alert("肖像模式 0,s ...

  2. C# 利用Aspose.Cells .dll将本地excel文档转化成pdf(完美破解版 无水印 无中文乱码)

    Aspose.Cells .dll下载  http://pan.baidu.com/s/1slRENLF并引用 C#代码 using System; using System.Collections. ...

  3. 解决Excel打开UTF-8编码CSV文件乱码的问题

    打开 Excel,执行“数据”->“自文本”,选择 CSV 文件,出现文本导入向导,选择“分隔符号”,下一步,勾选“逗号”,去掉“ Tab 键”,下一步,完成,在“导入数据”对话框里,直接点确定 ...

  4. poj3069【贪心,水】

    妈蛋,题意看错-看了挑战时被标记的点还是给出的点,瞎搞了半个多小时... = =都想气的扔进水题系列了 #include <iostream> #include <cstdio> ...

  5. poj3249【拓扑排序】

    //题意:   给出一个有向无环图,每个顶点都有一个权值. //         求一条从入度为0的顶点到出度为0的顶点的一条路径, //         路径上所有顶点权值和最大. //我觉得只要明 ...

  6. 纯JS阻止浏览器默认滚动事件,实现自定义滚动方法

    首先该方法兼容IE7+以上浏览器,可以实现页面上下滚动,而且也可以实现页面左右滚动,每次滚动的距离为屏幕的大小,滚动为加速滚动 javaScript代码如下: //滚动实现方法,使用鼠标滚轮每次滚动浏 ...

  7. 【数据结构(C语言版)系列三】 队列

    队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...

  8. UvaLive6441(期望概率dp)

    1.涉及负数时同时维护最大和最小,互相转移. 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: db a = (C[i] - W[i]) * dp1[i - ][ ...

  9. VS Code 自用插件备份

    自用插件备份 Auto Close Tag 自动闭合标签 Atuo Rename Tag 更改前面标签的时候, 自动更改后面的闭合标签 Guides 对齐线 open-in-browser 在浏览器中 ...

  10. 1-9方法的重写(override)

    什么是重写? 重写,也叫做覆盖,当父类中的方法无法满足子类需求时,子类可以将父类的方法进行重写编写来满足需求.比如孩子继承了父亲的房子,可以将房子重新装修. 方法重写的条件: 两个类必须是继承关系 必 ...