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

实现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更高效,但在随机访问上比它们慢。

 

相关文章:

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

一、ArrayList 数据结构与存储原理 ArrayList是基于动态数组实现的。它在内存中是一块连续的存储空间。当创建一个ArrayList时&#xff0c;会初始化一个默认大小&#xff08;通常为10&#xff09;的数组。随着元素的不断添加&#xff0c;如果数组容量不够&#xff0c;会进行扩…...

LeetCode 904.水果成篮

LeetCode 904.水果成篮 思路&#x1f9d0;&#xff1a; 求水果的最大数目&#xff0c;也就是求最大长度&#xff0c;我们是单调的向前求解&#xff0c;则能够想到使用滑动窗口进行解答&#xff0c;可以用hash表统计每个种类的个数&#xff0c;kinds变量统计当前种类&#xff0c…...

GitHub 开源项目 Puter :云端互联操作系统

每天面对着各种云盘和在线应用&#xff0c;我们常常会遇到这样的困扰。 文件分散在不同平台很难统一管理&#xff0c;付费订阅的软件越来越多&#xff0c;更不用说那些烦人的存储空间限制了。 最近在 GitHub 上发现的一个开源项目 Puter 彻底改变了我的在线办公方式。 让人惊…...

美创科技入选2024数字政府解决方案提供商TOP100!

11月19日&#xff0c;国内专业咨询机构DBC德本咨询发布“2024数字政府解决方案提供商TOP100”榜单。美创科技凭借在政府数据安全领域多年的项目经验、技术优势与创新能力&#xff0c;入选收录。 作为专业数据安全产品与服务提供商&#xff0c;美创科技一直致力于为政府、金融、…...

七天掌握SQL--->第五天:数据库安全与权限管理

1.1 用户权限管理 用户权限管理是指控制用户对数据库的访问和操作权限。在MySQL中&#xff0c;可以使用GRANT和REVOKE命令来管理用户权限。 GRANT命令用于授予用户权限。语法如下&#xff1a; GRANT privileges ON database.table TO userhost IDENTIFIED BY password;其中&…...

数学建模学习(138):基于 Python 的 AdaBoost 分类模型

1. AdaBoost算法简介 AdaBoost(Adaptive Boosting)是一种经典的集成学习算法,由Yoav Freund和Robert Schapire提出。它通过迭代训练一系列的弱分类器,并将这些弱分类器组合成一个强分类器。算法的核心思想是:对于被错误分类的样本,在下一轮训练中增加其权重;对于正确分类…...

丹摩|丹摩智算平台深度评测

1. 丹摩智算平台介绍 随着人工智能和大数据技术的快速发展&#xff0c;越来越多的智能计算平台涌现&#xff0c;为科研工作者和开发者提供高性能计算资源。丹摩智算平台作为其中的一员&#xff0c;定位于智能计算服务的提供者&#xff0c;支持从数据处理到模型训练的全流程操作…...

『VUE』34. 异步组件(详细图文注释)

目录 加载速度的优化示例代码总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 加载速度的优化 实际项目中你可能会有几十个组件,如果一开始就加载了全部组件(哪怕其中有些组件你暂时用不到)这无疑大大增加了响应时间,用户体验…...

深入解析自校正控制(STC)算法及python实现

目录 深入解析自校正控制(STC)算法第一部分:自校正控制算法概述1.1 什么是自校正控制1.2 自校正控制的核心思想1.3 STC 的应用场景1.4 STC 的分类第二部分:自校正控制算法的数学基础2.1 动态系统模型2.2 参数辨识方法2.3 控制器设计2.4 稳定性分析第三部分:Python 实现自校…...

《macOS 开发环境配置与应用开发》

一、引言 macOS 作为一款强大而流行的操作系统&#xff0c;为开发者提供了丰富的开发机会和优秀的开发环境。无论是开发原生的 macOS 应用&#xff0c;还是进行跨平台开发&#xff0c;了解和掌握 macOS 开发环境的配置以及应用开发的方法至关重要。本文将详细介绍 macOS 开发环…...

WebSocket 常见问题及解决方案

什么是 WebSocket&#xff1f; WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行双向通信&#xff0c;而不需要像传统 HTTP 那样每次请求都需要建立新的连接。WebSocket 协议在 2011 年被 IETF 定义为 RFC 6455 标准。 特点 双向通信&…...

如何在 .gitignore 中仅保留特定文件:以忽略文件夹中的所有文件为例

在日常的开发工作中&#xff0c;使用 Git 来管理项目是不可或缺的一部分。项目中的某些文件夹可能包含大量的临时文件、生成文件或不需要版本控制的文件。在这种情况下&#xff0c;我们通常会使用 .gitignore 文件来忽略这些文件夹。然而&#xff0c;有时我们可能希望在忽略整个…...

详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)

文章目录 前言1.插入排序&#xff08;InsertSort&#xff09;1.1 核心思路1.2 实现代码 2.选择排序&#xff08;SelectSort&#xff09;2.1 核心思路2.2 实现代码 3.冒泡排序&#xff08;BubbleSort&#xff09;3.1 核心思路3.2 实现代码 4.希尔排序&#xff08;ShellSort&…...

Linux虚拟机空间扩容(新增磁盘并分区挂载)

1、命令shutdown -h now关闭虚拟机&#xff08;要关机后再进行新增磁盘操作&#xff09; 云平台进入虚拟机管理&#xff0c;新增磁盘 成功添加一块100G的磁盘 3、在Linux终端下执行该命令&#xff1a;lsblk 发现有新添加的磁盘。 也新增了/dev/vdb 3、分区 输入命令&#xff1…...

数据结构 ——— 直接选择排序算法的实现

目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现&#xff08;默认升序&#xff09; 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…...

MySQL中的ROW_NUMBER窗口函数简单了解下

ROW_NUMBER() 是 MySQL8引入的窗口函数之一&#xff0c;它为查询结果集中的每一行分配一个唯一的顺序号&#xff08;行号&#xff09;。这个顺序号是基于窗口函数的 ORDER BY 子句进行排序的&#xff0c;可以根据指定的排序顺序生成连续的整数值。 ROW_NUMBER() 在分页、去重、…...

day24|leetCode 93.复原IP地址 , 78.子集 , 90.子集II

8.复原ip地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和"192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "…...

RocketMQ: Broker 使用指南

Broker 配置参数 获取 Broker 的默认配置 $ sh mqbroker -m Broker 启劢时&#xff0c;如何加载配置 ### 第一步生成 Broker 默认配置模版 sh mqbroker -m > broker.p ### 第二步修改配置文件, broker.p ### 第三步加载修改过的配置文件 nohup sh mqbroker -c broker.pBrok…...

【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行

文章目录&#xff1a; 【Linux 篇】Docker 的容器之海与镜像之岛&#xff1a;于 Linux 系统内探索容器化的奇妙航行前言安装docker-centos7 【Linux 篇】Docker 的容器之海与镜像之岛&#xff1a;于 Linux 系统内探索容器化的奇妙航行 &#x1f4ac;欢迎交流&#xff1a;在学习…...

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…...

GLM-4V-9B Streamlit交互设计解析:侧边栏上传+实时渲染+历史回溯实现

GLM-4V-9B Streamlit交互设计解析&#xff1a;侧边栏上传实时渲染历史回溯实现 1. 引言 你有没有遇到过这样的情况&#xff1a;拿到一个功能强大的AI模型&#xff0c;官方给的示例代码却在自己的电脑上跑不起来&#xff0c;要么是显存不够&#xff0c;要么是各种奇怪的报错&a…...

JASP统计分析软件:开源数据分析的技术实践指南

JASP统计分析软件&#xff1a;开源数据分析的技术实践指南 【免费下载链接】jasp-desktop JASP aims to be a complete statistical package for both Bayesian and Frequentist statistical methods, that is easy to use and familiar to users of SPSS 项目地址: https://…...

别再让蜂鸣器只会‘哔哔’叫了!用STM32F103的PWM和电容,DIY你的家电提示音库(附超级玛丽彩蛋)

用STM32F103打造专业级家电提示音库&#xff1a;从单调蜂鸣到沉浸式音效的进阶指南 1. 为什么传统蜂鸣器音效总让人皱眉&#xff1f; 每次听到微波炉完成加热时刺耳的"嘀——"声&#xff0c;或是洗衣机结束运转时机械的"哔哔"提示&#xff0c;总让人有种想…...

人脸识别OOD模型在医疗领域的应用探索

人脸识别OOD模型在医疗领域的应用探索 1. 引言 在医院里&#xff0c;每天都有成千上万的患者需要身份确认、用药核对和病情监测。传统的医疗身份验证方式如手环、身份证件等存在被冒用、丢失或信息错误的风险。而医护人员在繁忙的工作中&#xff0c;也可能因为疲劳或疏忽而错…...

Qwen3-Reranker-0.6B保姆级教程:requirements.txt依赖版本兼容性避坑指南

Qwen3-Reranker-0.6B保姆级教程&#xff1a;requirements.txt依赖版本兼容性避坑指南 1. 引言&#xff1a;为什么依赖版本如此重要 当你第一次接触Qwen3-Reranker-0.6B这个强大的重排序模型时&#xff0c;可能会觉得安装过程很简单——不就是运行一个pip install命令吗&#…...

3分钟免费制作AI视频:零基础也能成为数字导演

3分钟免费制作AI视频&#xff1a;零基础也能成为数字导演 【免费下载链接】auto-video-generateor 自动视频生成器&#xff0c;给定主题&#xff0c;自动生成解说视频。用户输入主题文字&#xff0c;系统调用大语言模型生成故事或解说的文字&#xff0c;然后进一步调用语音合成…...

彻底清理C盘自带软件方法:2026最新版强力卸载预装软件工具教程

电脑用着用着C盘就满了&#xff0c;开机小助手总提醒“磁盘空间不足”。点进控制面板一看&#xff0c;全是买电脑时自带的那些从未用过的软件&#xff0c;想卸载又怕卸不干净&#xff0c;甚至担心把系统搞崩溃。其实&#xff0c;彻底清理这些自带软件有章可循&#xff0c;关键是…...

从HDLbits的Verification题目看起:新手写Verilog代码最容易踩的3个坑(附避坑指南)

从HDLbits的Verification题目看起&#xff1a;新手写Verilog代码最容易踩的3个坑&#xff08;附避坑指南&#xff09; 当你第一次在仿真器里看到波形图像脱缰野马一样乱窜时&#xff0c;那种头皮发麻的感觉我至今记忆犹新。Verilog看似简单的语法背后&#xff0c;藏着无数让初学…...

3个高效功能让Maccy成为macOS必备剪贴板管理器

3个高效功能让Maccy成为macOS必备剪贴板管理器 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy Maccy是一款专为macOS设计的轻量级剪贴板管理器&#xff0c;能够记录复制历史&#xff0c;让用户轻松…...

别再只盯着username了!CTF表单注入题中,用Sqlmap探测password等隐藏参数的高效技巧

突破思维定式&#xff1a;CTF表单注入中隐藏参数的高阶利用策略 在CTF竞赛的Web安全赛道上&#xff0c;SQL注入始终是选手们的必修课。但当我们反复练习username参数注入时&#xff0c;出题人早已在暗处微笑——他们知道大多数选手会形成路径依赖。我曾在一个省级CTF比赛中遇到…...