在前两篇博客,学习了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. thiis also a test

    EL表达式 1.EL简介 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号, ...

  2. js获取动态日期时间

    var timer=null; function tt(n){ if(n<10){ return '0'+n }else{ return n+'' } } timer=setInterval(f ...

  3. ccflow_004请假流程-傻瓜表单-经典模式

    ccflow_004请假流程-傻瓜表单-经典模式

  4. (水题)洛谷 - P1598 - 垂直柱状图

    https://www.luogu.org/problemnew/show/P1598 忘记读取后清空数组,也不知道准确的长度. #include<bits/stdc++.h> using ...

  5. 《高性能iOS 应用开发》之降低你 APP 的电量消耗

    在编写高性能 代码时, 电量消耗是一个需要重点处理的重要因素, 就执行时间和 CPU 资源的利用而言, 我们不仅要实现高效的数据结构和算法, 还需要考虑其他的因素,如果某个应用是个电池黑洞,那么一定不 ...

  6. python __builtins__ enumerate类 (21)

    21.'enumerate', 用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. class enumerate(object ...

  7. SVG-viewBox属性详解

    viewBox( x, y, width, height)    用处:在svg画布中选择出一块区域放大到宽度或高度充满画布为止 (参数x/y可以理解为坐标为(x , y)的点(这里的坐标系和数学中的 ...

  8. The local variable fruit may not have been initialized 错误

    eclipse错误提示如图: 错误代码如图: 首先这错误的翻译是:局部变量"水果"尚未初始化,所以对象该如何初始化呢,我百度之后找到了答案,修改过后如下图所示. 这个错误的问题所在 ...

  9. spring boot eureka client

    eureka client @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { public st ...

  10. Adding New Machine ZOJ - 3540

    https://vjudge.net/problem/ZOJ-3540 错误记录: 扫描线没有考虑到同一行的要删除在前,加入在后:由于用了特殊的方式所以想当然以为不需要考虑这个问题 #include& ...