实现List接口的三类-ArrayList -Vector -LinkedList

一、ArrayList

  1. 数据结构与存储原理
    • ArrayList是基于动态数组实现的。它在内存中是一块连续的存储空间。当创建一个ArrayList时,会初始化一个默认大小(通常为10)的数组。随着元素的不断添加,如果数组容量不够,会进行扩容操作,一般是创建一个更大的数组(如原数组大小的1.5倍),然后将原数组中的元素复制到新数组中。
  2. 性能特点
    • 随机访问性能好:由于其基于数组的存储方式,通过索引访问元素非常快速,时间复杂度为O(1)。例如,使用get(int index)方法获取指定索引的元素时,直接通过数组下标就可以定位到元素。
    • 插入和删除性能较差(除末尾操作):在中间位置插入或删除元素时,需要移动后面的元素,时间复杂度为O(n)。比如在索引为3的位置插入一个元素,那么索引3及其后面的所有元素都要向后移动一位。不过,在末尾添加元素的时间复杂度为O(1)。
  3. 常用场景
    • 适用于需要频繁进行随机访问操作,并且对元素的添加和删除操作主要在末尾进行的场景。例如,存储一组学生的成绩,需要经常查询某个学生的成绩(随机访问),偶尔在末尾添加新的成绩数据。

二、Vector

  1. 数据结构与存储原理
    • Vector和ArrayList类似,也是基于动态数组实现的。不同的是,Vector是线程安全的,它的很多方法都是通过synchronized关键字修饰的,这意味着在多线程环境下多个线程访问同一个Vector对象时会进行同步控制。
  2. 性能特点
    • 线程安全带来的性能损耗:由于其线程安全的特性,在多线程并发访问时需要进行同步锁的获取和释放操作,这使得它的性能相对ArrayList要低。在单线程环境下,它的性能和ArrayList类似。
    • 随机访问性能好:同样基于数组结构,随机访问元素的时间复杂度为O(1)。
    • 插入和删除性能较差(除末尾操作):在中间插入或删除元素时需要移动元素,时间复杂度为O(n),在末尾添加元素时间复杂度为O(1)。
  3. 常用场景
    • 在多线程环境下,如果需要一个线程安全的动态数组结构来存储数据时可以使用Vector。不过在Java 5之后,更推荐使用Collections.synchronizedList(new ArrayList<>())这种方式来创建线程安全的列表,因为它比Vector更灵活,并且在非并发情况下性能更好。

三、LinkedList

  1. 数据结构与存储原理
    • LinkedList是基于双向链表实现的。每个节点包含了数据元素、指向前一个节点的引用和指向后一个节点的引用。
  2. 性能特点
    • 随机访问性能差:由于链表结构,要访问链表中的某个元素,需要从链表头(或尾)开始逐个节点遍历,时间复杂度为O(n)。例如,使用get(int index)方法获取指定索引的元素时,需要遍历链表找到该元素。
    • 插入和删除性能好(特别是在中间位置):在链表中插入或删除一个元素,只需要修改节点之间的引用关系,时间复杂度为O(1)(如果已经定位到要插入或删除的节点位置)。但是,如果要根据索引插入或删除元素,需要先遍历链表找到该索引对应的节点,这个遍历过程的时间复杂度为O(n)。
  3. 常用场景
    • 适用于需要频繁进行插入和删除操作(尤其是在列表中间),而对随机访问操作要求不高的场景。例如,实现一个简单的队列或者栈结构,使用LinkedList就比较合适。

ArrayList的常用方法

ArrayList是Java中常用的动态数组,它实现了List接口,提供了一系列用于操作数组的方法。以下是一些ArrayList的常用方法:

  1. add(E e):将指定的元素添加到列表的末尾。
  2. add(int index, E element):将指定的元素插入到指定位置。
  3. remove(int index):移除指定位置的元素。
  4. remove(Object o):移除指定的元素。
  5. get(int index):获取指定位置的元素。
  6. set(int index, E element):替换指定位置的元素。
  7. size():返回列表中的元素个数。
  8. isEmpty():判断列表是否为空。
  9. contains(Object o):判断列表是否包含指定的元素。
  10. clear():清空列表中的所有元素。
  11. toArray():将列表转换为数组。
  12. sort(Comparator<? super E> c):对列表中的元素进行排序。

Vector的常用方法

Vector是Java中的一个动态数组,它与ArrayList类似,但Vector是线程安全的。以下是一些Vector的常用方法:

  1. add(E e):将指定的元素添加到向量的末尾。
  2. add(int index, E element):将指定的元素插入到指定位置。
  3. remove(int index):移除指定位置的元素。
  4. remove(Object o):移除指定的元素。
  5. get(int index):获取指定位置的元素。
  6. set(int index, E element):替换指定位置的元素。
  7. size():返回向量中的元素个数。
  8. isEmpty():判断向量是否为空。
  9. contains(Object o):判断向量是否包含指定的元素。
  10. clear():清空向量中的所有元素。
  11. toArray():将向量转换为数组。
  12. sort(Comparator<? super E> c):对向量中的元素进行排序。

LinkedList的常用方法

LinkedList是Java中的一个双向链表,它实现了List接口,提供了一系列用于操作链表的方法。以下是一些LinkedList的常用方法:

  1. add(E e):将指定的元素添加到链表的末尾。
  2. add(int index, E element):将指定的元素插入到指定位置。
  3. remove(int index):移除指定位置的元素。
  4. remove(Object o):移除指定的元素。
  5. get(int index):获取指定位置的元素。
  6. set(int index, E element):替换指定位置的元素。
  7. size():返回链表中的元素个数。
  8. isEmpty():判断链表是否为空。
  9. contains(Object o):判断链表是否包含指定的元素。
  10. clear():清空链表中的所有元素。
  11. toArray():将链表转换为数组。
  12. sort(Comparator<? super E> c):对链表中的元素进行排序。

总结

ArrayList、Vector和LinkedList都是Java中常用的集合类,它们都实现了List接口,提供了一系列用于操作列表的方法。ArrayList和Vector都是基于数组实现的,而LinkedList是基于双向链表实现的。ArrayList和Vector在大多数情况下可以互换使用,但Vector是线程安全的,因此在多线程环境下可能更适合。LinkedList在插入和删除操作上比ArrayList和Vector更高效,但在随机访问上比它们慢。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

L14.【LeetCode笔记】返回倒数第k个节点

目录 1.题目 2.分析 思路 代码 提交结果 1.题目 面试题 02.02. 返回倒数第 k 个节点 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 注意&#xff1a;本题相对原题稍作改动 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 …

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中&#xff0c;处理 Excel 文件的导入导出是极为常见的需求。 今天&#xff0c;咱们就一起来深入了解一款非常实用的操作 Exce…

基于Java Springboot高校教室资源管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…

k8s1.31版本最新版本集群使用容器镜像仓库Harbor

虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…

C语言数据结构学习:循环队列

C语言 数据结构学习 汇总入口&#xff1a; C语言数据结构学习&#xff1a;[汇总] 1. 循环队列 队列的博客&#xff1a;C语言数据结构学习&#xff1a;队列 循环队列会预先定义最大队列空间&#xff0c;然后定义一个数组&#xff0c;通过队列头和队列尾指针分别指向开头和结尾&…

Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5&#xff0c;你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址&#xff1a;https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路…

Redis 常用数据类型插入性能对比:循环插入 vs. 批量插入

Redis 是一款高性能的键值数据库&#xff0c;其支持多种数据类型&#xff08;String、Hash、List、Set、ZSet、Geo&#xff09;。在开发中&#xff0c;经常会遇到需要插入大量数据的场景。如果逐条插入&#xff0c;性能会显得较低&#xff0c;而采用 Pipeline 批量插入 能大幅提…

oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist

oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程&#xff1a; OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…

node.js中使用express.static()托管静态资源

express.static()定义 express.static(root, [options])是一个中间件函数&#xff0c;负责为Express应用提供静态资源服务。它允许你指定一个或多个目录作为静态资源的根目录&#xff0c;当客户端请求这些资源时&#xff0c;Express会查找并返回对应的文件。 安装express npm i…

【含开题报告+文档+PPT+源码】基于SSM的社区老人服务系统设计与实现

开题报告 在当前人口老龄化趋势明显以及信息化社会发展背景下&#xff0c;基于 SSM 框架构建的社区老人服务系统具有深远的背景意义。首先&#xff0c;它响应了我国老龄化进程加快所带来的多元化、个性化养老服务需求&#xff0c;利用互联网技术为老年人提供便捷高效的在线申请…

Spring AI 框架使用的核心概念

一、模型&#xff08;Model&#xff09; AI 模型是旨在处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式和见解&#xff0c;这些模型可以做出预测、文本、图像或其他输出&#xff0c;从而增强各个行业的各种应用。 AI 模型有很多种&…

学习与理解LabVIEW中多列列表框项名和项首字符串属性

多列列表框控件在如下的位置&#xff1a; 可以对该控件右击&#xff0c;如下位置&#xff0c;即可设置该控件的显示项&#xff1a; 垂直线和水平线指的是上图中组成单元格的竖线和横线&#xff08;不包括行首列首&#xff09; 现在介绍该多列列表框的两个属性&#xff0c;分别…

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么

今天学Flink的关键技术–容错机制&#xff0c;用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点&#xff08;checkpoint&#xff09; Flink容错机制的核心是分布式数据流和状态的快照&#xff0c;从而当分布…

[译]Elasticsearch Sequence ID实现思路及用途

原文地址:https://www.elastic.co/blog/elasticsearch-sequence-ids-6-0 如果 几年前&#xff0c;在Elastic&#xff0c;我们问自己一个"如果"问题&#xff0c;我们知道这将带来有趣的见解&#xff1a; "如果我们在Elasticsearch中对索引操作进行全面排序会怎样…

七、SElinux

一、SElinux简介 SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linuxSELinux 主要由美国国家安全局(NSA)开发&#xff0c;当初开发的目的是为了避免资源的误用传统的访问控制在我们开启权限后&#xff0c;系统进程可以直接访问当我们对权限设置不严谨时…

鸿蒙开发-音视频

Media Kit 特点 一般场合的音视频处理&#xff0c;可以直接使用系统集成的Video组件&#xff0c;不过外观和功能自定义程度低Media kit&#xff1a;轻量媒体引擎&#xff0c;系统资源占用低支持音视频播放/录制&#xff0c;pipeline灵活拼装&#xff0c;插件化扩展source/demu…

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…