Java集合(六)--ArrayList、LinkedList和Vector对比
在前两篇博客,学习了ArrayList和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对比的更多相关文章
- Javase之集合体系(2)之List及其子类ArrayList,LinkedList与Vector及其迭代器知识
集合体系之List及其子类ArrayList,LinkedList与Vector及其迭代器知识 List(接口) 特点:有序(存储与取出顺序相同),可重复 List子类特点: ArrayList: ...
- Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
- java集合系列之LinkedList源码分析
java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...
- 从源码看Java集合之ArrayList
Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int ...
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
- java 集合之ArrayList、Vector、LinkedList、CopyOnWriteArrayList
ArrayList 线程不安全. 底层Object[]数组实现,用transient关键字修饰,防止序列化,然后重写了readObject和writeObject方法,为了提高传输效率. 插入时会判断 ...
- List集合与Set集合(ArrayList,LinkedList,Vector,HashSet,LinkedHashSet,可变参数)
List集合介绍及常用方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* java. ...
- Java集合之ArrayList和LinkedList的实现原理以及Iterator详解
ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...
随机推荐
- 监听屏幕旋转事件window. onorientationchange
// 判断屏幕是否旋转 function orientationChange() { switch(window.orientation) { case 0: alert("肖像模式 0,s ...
- C# 利用Aspose.Cells .dll将本地excel文档转化成pdf(完美破解版 无水印 无中文乱码)
Aspose.Cells .dll下载 http://pan.baidu.com/s/1slRENLF并引用 C#代码 using System; using System.Collections. ...
- 解决Excel打开UTF-8编码CSV文件乱码的问题
打开 Excel,执行“数据”->“自文本”,选择 CSV 文件,出现文本导入向导,选择“分隔符号”,下一步,勾选“逗号”,去掉“ Tab 键”,下一步,完成,在“导入数据”对话框里,直接点确定 ...
- poj3069【贪心,水】
妈蛋,题意看错-看了挑战时被标记的点还是给出的点,瞎搞了半个多小时... = =都想气的扔进水题系列了 #include <iostream> #include <cstdio> ...
- poj3249【拓扑排序】
//题意: 给出一个有向无环图,每个顶点都有一个权值. // 求一条从入度为0的顶点到出度为0的顶点的一条路径, // 路径上所有顶点权值和最大. //我觉得只要明 ...
- 纯JS阻止浏览器默认滚动事件,实现自定义滚动方法
首先该方法兼容IE7+以上浏览器,可以实现页面上下滚动,而且也可以实现页面左右滚动,每次滚动的距离为屏幕的大小,滚动为加速滚动 javaScript代码如下: //滚动实现方法,使用鼠标滚轮每次滚动浏 ...
- 【数据结构(C语言版)系列三】 队列
队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...
- UvaLive6441(期望概率dp)
1.涉及负数时同时维护最大和最小,互相转移. 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: db a = (C[i] - W[i]) * dp1[i - ][ ...
- VS Code 自用插件备份
自用插件备份 Auto Close Tag 自动闭合标签 Atuo Rename Tag 更改前面标签的时候, 自动更改后面的闭合标签 Guides 对齐线 open-in-browser 在浏览器中 ...
- 1-9方法的重写(override)
什么是重写? 重写,也叫做覆盖,当父类中的方法无法满足子类需求时,子类可以将父类的方法进行重写编写来满足需求.比如孩子继承了父亲的房子,可以将房子重新装修. 方法重写的条件: 两个类必须是继承关系 必 ...