ArrayList、 LinkedList 和 Vector之间的区别

ArrayList、 LinkedList 和 Vector都实现了List接口,是List的三种实现,所以在用法上非常相似。他们之间的主要区别体现在不同操作的性能上。后面会详细分析。

ArrayList

ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。

LinkedList

LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。

数组中查询和赋值比较快,因为可以直接通过数组下标访问指定位置。

链表中删除和增加比较快,因为可以直接通过修改链表的指针(Java中并无指针,这里可以简单理解为指针。其实是通过Node节点中的变量指定)进行元素的增删。

所以,LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。

Vector

Vector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。

如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。

二者之间还有一个区别,就是扩容策略不一样。在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

效率对比试验

package Action;import java.util.ArrayList;
import java.util.LinkedList;public class test {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<Integer>();LinkedList<Integer> linkedList = new LinkedList<Integer>();// ArrayList addlong startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {arrayList.add(i);}long endTime = System.nanoTime();long duration = endTime - startTime;System.out.println("ArrayList add:  " + duration);System.gc();// LinkedList addstartTime = System.nanoTime();for (int i = 0; i < 100000; i++) {linkedList.add(i);}endTime = System.nanoTime();long duration1 = endTime - startTime;System.out.println("LinkedList add: " + duration1);System.out.println((duration<duration1?"ArrayList add":"LinkedList add")+"更快");System.out.println("--------------------------");System.gc();// ArrayList getstartTime = System.nanoTime();for (int i = 0; i < 10000; i++) {arrayList.get(i);}endTime = System.nanoTime();long duration2 = endTime - startTime;System.out.println("ArrayList get:  " + duration2);System.gc();// LinkedList getstartTime = System.nanoTime();for (int i = 0; i < 10000; i++) {linkedList.get(i);}endTime = System.nanoTime();long duration3 = endTime - startTime;System.out.println("LinkedList get: " + duration3);System.out.println((duration2<duration3?"ArrayList get":"LinkedList get")+"更快");System.out.println("--------------------------");System.gc();// ArrayList removestartTime = System.nanoTime();for (int i = 9999; i >= 0; i--) {arrayList.remove(i);}endTime = System.nanoTime();long duration4 = endTime - startTime;System.out.println("ArrayList remove:  " + duration4);System.gc();// LinkedList removestartTime = System.nanoTime();for (int i = 9999; i >= 0; i--) {linkedList.remove(i);}endTime = System.nanoTime();long duration5 = endTime - startTime;System.out.println("LinkedList remove: " + duration5);System.out.println((duration4<duration5?"ArrayList remove":"LinkedList remove")+"更快");System.out.println("--------------------------");}
}

效果

添加和删除操作上LinkedList更快,但在查询速度较慢。所以很多时候具体问题具体分析。

但是如果是多线程的时候要选择Vector方便一些同步好处理。

如果不涉及到多线程就从LinkedList、ArrayList两个中选。

LinkedList更适合从中间插入或者删除(链表的特性)

ArrayList更适合检索和在末尾插入或删除(数组的特性)

希望能对大家有一些帮助。

【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)相关推荐

  1. 【蓝桥杯Java_C组·从零开始卷】第四节(附)、字符串常用函数

    导读 本文章将java中字符串常用的字符串进行罗列与对应demo的示例,帮助java初学者与蓝桥杯参赛的选手提升对JavaSE的理解. 目录 字符串由来 字符串转成byte数组 常用字符串函数列表: ...

  2. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组

    整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...

  3. 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解

    由于咱们针对与算法使用,所有会有一些个函数可能平时用不到. 目录 list基础增 删 改 查 算法中最常用的交换 自然排序 反向排序·注不是倒序,不是倒序,不是倒序 随机排序 判断是否有某元素 集合截 ...

  4. 【蓝桥杯Java_C组·从零开始卷】第八节、综合测试

    1.利用[^]进行x与y两个变量的值交换,并写明注释 2.考试奖励 小明期末考试,爸爸承诺如果小明考了: 1.100 - 95分奖励小明山地自行车一辆: 2.94 - 90分奖励小明到游乐园玩一天: ...

  5. 【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型运算符与类型分析

    B站高清回放地址: [https://www.bilibili.com/video/BV1Bm4y1Q7Wt?spm_id_from=333.999.0.0] 目录 一.Java环境搭建与使用(Ecl ...

  6. 【蓝桥杯Java_C组·从零开始卷】第七节、递归

    目录 递归概述 递归: 循环: 疑问: 是什么递归? 递归的精髓(思想)是什么? 递归的三要素 1). 明确递归终止条件 2). 给出递归终止时的处理办法 3). 提取重复的逻辑,缩小问题规模* 递归 ...

  7. 【蓝桥杯Java_C组·从零开始卷】第六节(二)、蓝桥杯常用数学公式

    目录 1.欧几里得定理 2.最大公约数 3.最小公倍数 4.海伦公式(求三角形面积) 5.排序公式 1.欧几里得定理 package Action;public class demo {/** 求最大 ...

  8. 【蓝桥杯Java_C组·从零开始卷】第六节(一)、Java常用数学函数

    目录 1.Math.sqrt() : 计算平方根 2.Math.cbrt() : 计算立方根 3.Math.pow(a, b) : 计算a的b次方 4.Math.max( , ) :计算最大值 5.M ...

  9. 【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用

    不限制长度的浮点数计算[BigDecimal] 目录 BigDecimal四则运算与取模运算 RoundingMode枚举介绍 RoundingMode舍入模式 UP CEILING FLOOR HA ...

最新文章

  1. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)
  2. 带AI无人车上云驾校,不出门练遍各大城市道路,华南理工大学团队拿下“互联网+”大赛金奖...
  3. 音视频技术开发周刊 | 156
  4. pytest十二:cmd命令行参数
  5. VMware Player 12.5.0 中文免费版
  6. MongoDB 主从复制(主从集群 )
  7. Mac下如何将 GBK 编码的文档转成 UTF-8 编码的?
  8. 如何通过a链接实现图片下载
  9. 汇智网node学习笔记
  10. Android RecyclerView万能分割线
  11. minus_Java即时类| minus()方法与示例
  12. 用了TCP协议,就一定不会丢包吗?
  13. 猫眼电影MySQL数据库怎么写_猫眼电影和电影天堂数据csv和mysql存储
  14. http、https和数字证书的相关知识
  15. Informatic PowerCenter 学习记录
  16. 汽车转向角度和转向半径的关系
  17. 程序员通过国企面试,HR说保底17薪但不写合同,靠不靠谱?
  18. 会声会影2023专业版视频处理制作软件功能详细介绍
  19. QNX7.1 交叉编译开源库
  20. 1.4_16 Axure RP 9 for mac 高保真原型图 - 案例15 【动态面板-滚动条5】深色模式 - 按钮效果升级

热门文章

  1. linux 创建匿名ftp,Linux使用pure-ftpd建立匿名ftp的方法
  2. phpcms 指定id范围 调用_Elasticsearch v7 中Java High-Level REST Client同步和异步调用
  3. 学习伟大的Python的第七天
  4. HDU - 1827 Summer Holiday (强连通)
  5. Flask框架后端开发常见错误处理(2018/11/14)
  6. IntelliTest实战直通车(上集)
  7. Android 第三方库RxLifecycle使用
  8. topcoder SRM 625 DIV2 IncrementingSequence
  9. TFTP更新linux或android系统文件
  10. MySQL(8)数据库中的高级(进阶)正则和存储过程