当前位置: 首页 > news >正文

【面试干货】ArrayList、Vector、LinkedList的存储性能和特性比较

【面试干货】ArrayList、Vector、LinkedList的存储性能和特性比较

  • 1、ArrayList
    • 1.1 存储性能
    • 1.2 特性
    • 1.3 示例用法
  • 2、Vector
    • 2.1 存储性能
    • 2.2 特性
    • 2.3 示例用法
  • 3、LinkedList
    • 3.1 存储性能
    • 3.2 特性
    • 3.3 示例用法
  • 4、ArrayList、Vector、LinkedList用法总结


💖The Begin💖点点关注,收藏不迷路💖

在Java中,ArrayList、Vector和LinkedList是三种最常用的列表实现。它们各自有不同的存储机制和性能特性,适用于不同的场景。下面我们将详细比较这三种列表的存储性能和特性。

1、ArrayList

ArrayList是一个基于动态数组实现的列表,它允许在列表中存储重复的元素。ArrayList的初始容量可以指定,但是会随着元素的添加而自动增长。

1.1 存储性能

1、插入性能: 在列表的末尾插入元素的时间复杂度是O(1),但在列表的中间或开头插入元素需要移动其他元素,时间复杂度为O(n)。

2、删除性能: 删除特定位置元素的时间复杂度也是O(n),因为需要移动被删除元素之后的所有元素。

3、查询性能: 通过索引查询元素的时间复杂度是O(1)。

1.2 特性

1、动态数组: ArrayList内部使用数组来存储元素,数组的大小会根据需要自动增长。

2、非线程安全: ArrayList不是线程安全的,如果在多线程环境下使用,需要额外的同步措施。

3、随机访问: 由于ArrayList基于数组实现,因此可以高效地通过索引访问元素。

1.3 示例用法

ArrayList<String> list = new ArrayList<>();  list.add("Element 1");  list.add("Element 2");  
System.out.println(list.get(0)); // 输出 "Element 1"

2、Vector

Vector与ArrayList类似,也是基于动态数组实现的列表,但它提供了线程安全的功能。

2.1 存储性能

1、与ArrayList类似,Vector在列表末尾插入和删除元素的时间复杂度是O(1),但在列表中间或开头插入和删除元素的时间复杂度为O(n)。

2、查询性能也是O(1)。

2.2 特性

1、线程安全: Vector是线程安全的,它的所有方法都是同步的,这使得它在多线程环境下更安全,但也带来了性能上的开销。

2、动态数组: 与ArrayList一样,Vector也使用动态数组来存储元素。

3、随机访问: Vector也支持通过索引高效访问元素。

2.3 示例用法

Vector<String> vector = new Vector<>();  vector.add("Element 1");  vector.add("Element 2");  
System.out.println(vector.get(0)); // 输出 "Element 1"

3、LinkedList

LinkedList是一个基于双向链表实现的列表,它允许在列表的任意位置高效地插入和删除元素。

3.1 存储性能

1、插入性能: 在LinkedList的开头或结尾插入元素的时间复杂度是O(1),在列表中间插入元素的时间复杂度是O(n)。

2、删除性能: 删除LinkedList中特定位置元素的时间复杂度也是O(n),但删除开头或结尾的元素是O(1)。

3、查询性能: 通过索引查询LinkedList中元素的时间复杂度是O(n),因为需要从头或尾开始遍历链表。

3.2 特性

1、双向链表: LinkedList使用双向链表来存储元素,这使得在链表的开头和结尾插入和删除元素非常高效。

2、非线程安全: 与ArrayList一样,LinkedList也不是线程安全的。

3、顺序访问: 由于LinkedList基于链表实现,因此更适合顺序访问元素,而不是通过索引随机访问。

3.3 示例用法

LinkedList<String> linkedList = new LinkedList<>();  linkedList.add("Element 1");  linkedList.add("Element 2");  
System.out.println(linkedList.getFirst()); // 输出 "Element 1"

4、ArrayList、Vector、LinkedList用法总结

1、如果需要频繁地通过索引访问元素,并且不关心线程安全,那么ArrayList是更好的选择。

2、如果需要在多线程环境下使用列表,并且可以接受同步带来的性能开销,那么Vector是更好的选择。

3、如果需要频繁地在列表的开头或结尾插入和删除元素,并且不关心通过索引访问元素,那么LinkedList是更好的选择。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

  • 类android设备reset过程
  • C++语法08 数据类型之间的强制转换
  • FlinkCDC 3.1.0 支持 Flink 1.18.0 版本选择
  • B树与B+树与Mysql innodb的B+树和其相关索引
  • 厂里资讯之总体架构介绍以及环境搭建
  • PostgreSQL基础(十四):PostgreSQL的数据迁移
  • IT入门知识博客文章大纲(0/10)
  • Windows 11部署FunASR离线语音识别系统
  • iOS接入Flutter
  • 带侧边栏布局:带导航的网页
  • Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.
  • 如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题
  • Python语言例题集(015)
  • 【Go语言】Go语言中的接口类型
  • C++ 进制转换
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Java Agent 学习笔记
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Laravel Mix运行时关于es2015报错解决方案
  • Nodejs和JavaWeb协助开发
  • Odoo domain写法及运用
  • Promise初体验
  • 高性能JavaScript阅读简记(三)
  • 欢迎参加第二届中国游戏开发者大会
  • 经典排序算法及其 Java 实现
  • 离散点最小(凸)包围边界查找
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #if等命令的学习
  • #QT(一种朴素的计算器实现方法)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (+4)2.2UML建模图
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (3)STL算法之搜索
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (黑马点评)二、短信登录功能实现
  • (离散数学)逻辑连接词
  • (三)SvelteKit教程:layout 文件
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (学习日记)2024.01.09
  • (原)Matlab的svmtrain和svmclassify
  • (转)visual stdio 书签功能介绍
  • (轉貼) UML中文FAQ (OO) (UML)
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PHP二维数组遍历时同时赋值
  • ... 是什么 ?... 有什么用处?
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net 6.0--通用帮助类--FileHelper
  • .NET 8.0 发布到 IIS