【 java 集合】List接口常用实现类对比以及ArrayList和LinkedList源码分析

news2024/9/21 14:42:46

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

目录

    • 📋 个人简介
  • 前言
    • 概述
    • 面试题:ArrayList 、 LinkedList 和 Vector 三者的异同?
    • 部分类的源码分析
      • ArrayList 的源码分析
      • LinkedList 的源码分析
      • Vector 的源码分析
  • 结语

前言

List接口继承自Collection接口,常用的List实现类有ArrayList、LinkedList、Vector。本节将大概对比一下他们三者的不同!并且分析一下源码!

概述

  • 鉴于 Java 中数组用来存储数据的局限性,我们通常使用 List 替代数组。
  • Lis 集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
  • List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
  • JDKAPI 中 List 接口的实现类常用的有: ArrayList 、 LinkedList 和 Vector 。

因此,我们常常将List接口称作动态数组!

面试题:ArrayList 、 LinkedList 和 Vector 三者的异同?

相同:三个类都实现了List接口,存储数据的特点相同:存储有序的、可重复的数据。

不同:
ArrayList :作为List接口的主要实现类;线程不安全的,效率高,底层使用Object [ ] elementData存储。

LinkedList:对于频繁的插入,删除操作,使用此类会比ArrayList效率高;因为LinkedList底层使用的是双向链表!

Vector:作为List接口的古老实现类;线程安全的,效率低,底层使用Object [ ] elementData存储。

部分类的源码分析

这里我大概分析一下ArrayList和LinkedList的源码,就不详细分析了,之前详细分析了一下StringBuffer的源码。其实和ArrayList差不多,底层都是对数组的扩容。

ArrayList 的源码分析

jdk7和jdk8的ArrayList底层稍有些不同,我用的是较新的jdk17,源码和jdk8基本上是一样的,大概来分析一下吧!
首先当你new ArrayList()之后,会调用空参构造器,创建一个空的,长度为零的数组。

在这里插入图片描述
在这里插入图片描述
然后往里面添加元素时,会将数组的长度扩容为10。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,当刚开始长度为零时,执行else分支,将长度扩容为10。==即第一次调用add()时,底层才创建了长度为10的数组,然后将数据添加到了elementDate[0]中。==这也是和jdk7不同之处!。

此时继续添加,容量是够的,不扩容,当添加到数组长度为10时,继续添加就要扩容了,此时进入if分支。
在这里插入图片描述
在这里插入图片描述
相当于将容量扩大了1.5倍!

总结一下:jdk中ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的创建类似于单例的懒汉式,延迟了数组的创建,节省内存!通过分析源码,我们也可以得出,new ArrayList时建议使用带参数的构造器,即自定义给它初始容量!

LinkedList 的源码分析

前面说了,他的底层是双向链表,这个在数据结构中应该都学过,思想应该都明白,相对于数组而言,链表有利于插入和删除操作,但相对数组而言,链表的查找功能不及数组,数组可以直接取索引,链表要从头查找!

在这里插入图片描述
new LinkedList,内部申明了头结点first和尾部节点last,默认为null,添加一个元素后,这个元素即为头结点,又是尾节点。
在这里插入图片描述
我们来看看这个Node类型。
在这里插入图片描述
再来看看add操作!
在这里插入图片描述

在这里插入图片描述
看起来很清晰,这里我不再解释,可以自己去了解数据结构的知识!

Vector 的源码分析

Vector已经不常用了,所以这里不再分析源码,感兴趣的可以去看看,分析了这么多源码,应该也能看懂!那我们说ArrayList是线程不安全的,而Vector是线程安全的,我们基本不用Vector,又如何实现线程安全呢?
这个不用担心,即使需要线程安全的场景,我们也不愿意使用Vector,后面会讲到Collections这个工具类,里面有方法可以将ArrayList转变为线程安全的!

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绿控传动冲刺科创板上市:连年亏损,现金流紧张,计划募资11亿元

近日,苏州绿控传动科技股份有限公司(下称“绿控传动”)在上海证券交易所递交招股书,准备在科创板上市。 本次冲刺上市,绿控传动计划募资10.72亿元,其中7.16亿元用于年产新能源商用车电驱动系统10万套项目&a…

泛微特色政务应用:对内协同办公、对外高效服务,推动政务数字化

近年来,国家不断深入建设“数字化政府”,政务服务“网上办”、“掌上办”、“一网通办”已经成为政务服务新方向。 泛微数字化运营平台为各级政府机关、行政事业单位,打造覆盖各级市、区、县、乡镇街道、村及各级社区部门的网上协同办公平台…

Qt编译CTK

文章目录一、CTK简介二、CTK下载三、CTK编译一、CTK简介 CTK是什么 CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit CTK 提供了什么 当前,CTK 工作的主要范围包括: DICOM:提供了从 PACS 和本地数据库中查询和…

基础数据结构——链表

目录 一、链表 1、数组的缺点 2、链表 3、单向链表 4、双向链表 5、Python链表的实现 二、例题 一、链表 1、数组的缺点 1)需要占用连续的空间 若某个数组很大,可能没有这么大的连续空间给它用。 2)不方便删除和插入 例如删除数组…

MySQL如何查看未提交的事务SQL

点击上方蓝字关注我MySQL中经常遇到事务中的SQL正在执行或执行完成后未提交,如何找出对应的SQL?1. 查看正在执行的SQL查看事务中正在执行的SQL方式有多种,例如1.1 通过processlist查看会话1:执行1个SQLmysql> begin; Query OK…

AC7811-BLDC无感控制代码调试与测试记录

接线注意 供电 对于 AC781x 电机 Demo 板,其 MCU 控制板和功率板的 12V 输入只需接一路即可,如果电机额定电压为 12V,那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可,不需要再额外供电;如果电机的额定电压…

配置磁盘多路径聚合

一 安装多路径软件 yum install -y device-mapper device-mapper-multipath 二 配置多路径聚合 在每个节点上都需要配置下多路径聚合。 /* 注意事项: 新添加盘后要扫描下,才能识别到(如果已经看到盘了,即执行multipath -ll能看到&#…

《收获,不止Oracle》读书笔记之性能提升千倍

体系学习让SQL语句性能提升千倍 未优化前,单车速度 drop table t purge; create table t(x int);create or replace procedure proc1 as beginfor i in 1..100000loopexecute immediateinsert into t values (||i||);commit;end loop; end; / /*这里要记得预先执行…

linux下常用调试技巧

1 linux下如何查看静态库和动态库都链接了那些库 1.1 静态库.a是没有指令可以看到其在生成过程中链接了那些库的 1.2 动态库.so可以通过ldd指令查看其在生成过程中链接了那些库 还有一种简单直观的方法,我们可以在编译过程中看到所生成的二进制文件,链接了那些库: 平时编译…

[阶段4 企业开发进阶] 7. 微服务--SpringCloud Alibaba

文章目录1 服务注册和配置中心Nacos1.1 Nacos简介1.2 Nacos作为服务注册中心服务提供者注册服务消费者注册和负载服务注册中心对比1.3 Nacos作为服务配置中心基础配置分类配置DataID方案配置Group方案配置Namespace方案配置1.4 Nacos集群和持久化配置2 服务熔断和限流SentinelS…

指针仪表读数识别系统 yolov7

指针仪表读数识别系统通过 yolov7opencv计算机视觉分析技术,利用现场摄像头可以自动识别指针型仪表读数并将读数回传给平台节省人工巡检读表的时间。YOLOv7 在 5 FPS 到 160 FPS 范围内,速度和精度都超过了所有已知的目标检测器,并在V100 上,…

【日常系列】LeetCode《24·贪心1》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 455 &#xff1a;分发饼干 - 贪心思想 https://leetcode.cn/problems/assign-cookies/ 提示&#xff1a; 1 < g.length < 3 * 10^4 0 < s.len…

配置双网卡聚合

一 服务器多网卡聚合的意义 1、多网卡聚合&#xff0c;可以起到网络链路冗余作用&#xff0c;当故障发生时&#xff0c;网络自动切换&#xff0c;保证业务数据不中断。 2、多网卡聚合成一条虚拟链路&#xff0c;可实现网络带宽提升&#xff0c;如2个1000Mbps的网卡聚合&#…

【收藏】使用Google Colab随时随地运行Python代码

Colab官网 什么是 Colab? Colab,或“Colaboratory”,允许您在浏览器中编写和执行 Python,不需要依赖本地资源。具有以下优势: 需要零配置免费使用GPU轻松分享几大非常方便的特性: 和Google Drive无缝融合 可以将文件存储在Google Drive里面,同时也可以从Google Driv…

TiDB性能调优

文章目录一、 TiDB 常见配置优化1.1 限制 SQL 内存使用和执行时间1.1.1 执行时间限制1.1.2 内存使用限制1.2 事务重试设置1.3 Join 算子优化1.4 常见 Mysql 兼容问题1.5 其他优化项二、TiKV优化2.1 TiKV 线程池优化2.1.1 GRPC2.1.2 Scheduler2.1.3 Raftstore2.1.4 UnifyReadPoo…

对象存储服务MinIO

1. MinIO简介 对象存储的方式对比 分布式文件系统 MinIO概述: 1.MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。 2.Golang语言实现&#xff0c;配置简单&#xff0c;单行命令…

学习css3,使用代码实现一根心爱的二踢脚

2023春节快到了&#xff0c;虽然还在上班&#xff0c;但心情早已开始激动&#xff0c;感叹2022终将过去&#xff0c;喜迎2023兔年吧。让我以激动的心情&#xff0c;利用所学css3代码知识&#xff0c;实现一根心爱的二踢脚吧。 目录 1、实现思路 2、实现二踢脚的主体圆柱部分…

数据的存储(1)数据类型,整型在内存中的存储

TIPS 1. 函数递归必须存在限制条件。 2. 一维数组与二维数组在内存当中是连续存放的&#xff0c;二维数组的话反正也是一行一行往下走。如果能知道起始地址的话&#xff0c;后面顺藤摸瓜会很容易。 3. 数组越界的话&#xff0c;C语言本身是不做检查的。数组传参传的是数组首…

【跟学C++】面向对象三大特征——继承(Study20)

文章目录1、了解继承2、基类与派生类(父类与子类)2.1、概念2.2、案例展示3、构造顺序与析构顺序4、继承种类4.1、私有继承4.2、保护继承4.3、多继承5、总结 【说明】 大家好&#xff0c;本专栏主要是跟学C内容&#xff0c;自己学习了这位博主【 AI菌】的【C21天养成计划】&…

十五、类加载器、反射

类加载器 1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法访问类或者接口的类变量&#xff0c;或者为该类变量赋值使用反射方式来…