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

Java,数据结构与集合源码,关于List接口的实现类(ArrayList、Vector、LinkedList)的源码剖析

目录

ArrayList

ArrayList的特点:

ArrayList源码解析:

Vector

Vector的特点:

Vector源码解析:

LinkedList

LinkedList的特点:

LinkedList的源码剖析:

使用说明:


ArrayList

ArrayList的特点:

·实现类List接口,存储有序的、可以重复的数据。
·底层使用Object[ ]数组存储数据。
·线程不安全的。

ArrayList源码解析:

jdk7版本:
ArrayList<String> list = new ArrayList<>();//①
list.add("AA");//②
list .add( "BB" );//③
……
①处在new时,底层初始化了Object类型的数组elementData,初始化长度为10,即Object[ ] elementData = new Object[10];(类似于饿汉式)
②处相当于将elementData数组的元素下标为0的元素赋值为“AA”。即element[0] = "AA";
③处相当于将elementData数组的元素下标为1的元素赋值为“BB”。即element[1] = "BB";
当要添加第11个元素的时候,底层的element数组已满,则需要扩容。默认扩容为原来长度的1.5倍,并将原有数组中的元素复制到新的数组中。
jdk8版本:
ArrayList<String> list = new ArrayList<>();//①
list.add("AA");//②
list .add( "BB" );//③
……
①处在new时,底层初始化了Object类型的数组elementData,即Object[ ] elementData = new Object[ ]{};(类似于懒汉式)
②处首次添加元素时,会初始化数组elementData = new Object[10];   再将elementData数组的元素下标为0的元素赋值为“AA”。即element[0] = "AA";
③处相当于将elementData数组的元素下标为1的元素赋值为“BB”。即element[1] = "BB";
当要添加第11个元素的时候,底层的element数组已满,则需要扩容。默认扩容为原来长度的1.5倍,并将原有数组中的元素复制到新的数组中。

Vector

Vector的特点:

·实现类List接口,存储有序的、可以重复的数据。
·底层使用Object[ ]数组存储数据。
·线程安全的。

Vector源码解析:

(jdk8)
Vector v = new Vector();//①
v.add("AA");//②
v.add("BB");//③
①处在new时,底层初始化了Object类型的数组elementData,初始化长度为10,即Object[ ] elementData = new Object[10];(类似于饿汉式)
②处相当于将elementData数组的元素下标为0的元素赋值为“AA”。即element[0] = "AA";
③处相当于将elementData数组的元素下标为1的元素赋值为“BB”。即element[1] = "BB";
当要添加第11个元素的时候,底层的element数组已满,则需要扩容。默认扩容为原来长度的2倍,并将原有数组中的元素复制到新的数组中。

LinkedList

LinkedList的特点:

·实现类List接口,存储有序的、可以重复的数据。
·底层使用双向链表存储数据。
·线程不安全的。

LinkedList的源码剖析:

(jdk8)
LinkedList<String> list = new LinkedList<>();//①
list.add("AA");//②
list.add("BB");//③
①处并没有什么执行操作
②处将“AA”封装到一个Node对象1中,list对象的属性frist、last都指向此Node对象1。
③处将“BB”封装到一个Node对象2中,Node对象1和Node对象2构成双向链表,同时last指向Node对象2
因为LinkedList使用的是双向链表,不需要考虑扩容问题。

使用说明:

Vector基本不使用。
ArrayList底层使用数组结构,查找和添加操作效率高,时间复杂度为O(1)。删除和插入操作效率低,时间复杂度为O(n)。
LinkedList底层使用双向链表,查找和添加操作效率低,时间复杂度为O(n)。删除和插入操作效率高,时间复杂度为O(1)。
ArrayList除了有空参的构造器,默认底层长度为10之外,还可以传入int类型的值指定底层数组的长度。如果需要的底层数组长度大,又知道大概的数组长度需求,使用此指定底层数组长度的构造器可以避免频繁的新建的数组,让程序效率提高。

相关文章:

Java,数据结构与集合源码,关于List接口的实现类(ArrayList、Vector、LinkedList)的源码剖析

目录 ArrayList ArrayList的特点&#xff1a; ArrayList源码解析&#xff1a; Vector Vector的特点&#xff1a; Vector源码解析&#xff1a; LinkedList LinkedList的特点&#xff1a; LinkedList的源码剖析&#xff1a; 使用说明&#xff1a; ArrayList ArrayList的…...

算法基础(python版本)

第二章 算法设计思想 一、搜索排序 1.排序算法 https://visualgo.net/zh/sorting (1)冒泡排序 # 思路&#xff1a; # (1)比较相邻元素&#xff0c;如果第一个比第二个大&#xff0c;则交换他们 # (2)第一轮下来&#xff0c;可以保证最后一个数一定是最大的&#xff1b;第二…...

使用Arrays.Sort并定制Comparator排序解决合并区间

合并区间-力扣算法题56题 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&am…...

【机器学习】039_合理初始化

一、稳定训练 目标&#xff1a;使梯度值在更合理的范围内 常见方法如下&#xff1a; 将乘法变为加法 ResNet&#xff1a;当层数较多时&#xff0c;会加入一些加法进去 LSTM&#xff1a;如果时序序列较长时&#xff0c;把一些对时序的乘法做加法 归一化 梯度归一化&…...

使用Arrays.asList与不使用的区别

在写算法的时候&#xff0c;遇到了有的题解使用的是Arrays.asList&#xff0c;也有的是直接新建一个List集合将元素加进去的。 看了一下算法的时间&#xff0c;两者居然相差了9秒。 算法原地址&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…...

基于可变形卷积和注意力机制的带钢表面缺陷快速检测网络DCAM-Net(论文阅读笔记)

原论文链接->DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Based on Deformable Convolution and Attention Mechanism | IEEE Journals & Magazine | IEEE Xplore DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Base…...

el-table 对循环产生的空白列赋默认值

1. el-table 空白列赋值 对el-table中未传数据存在空白的列赋默认值0。使用el-table 提供的插槽 slot-scope&#xff1a;{{ row || ‘0’ }} 原数据&#xff1a; <el-table-column label"集镇" :propcity ><template slot-scope"{row}">{{…...

新一代网络监控技术——Telemetry

一、Telemetry的背景 传统的网络设备监控方式有SNMP、CLI、Syslog、NetStream、sFlow&#xff0c;其中SNMP为主流的监控数据方式。而随着网络系统规模的扩大&#xff0c;网络设备数量的增多&#xff0c;网络结构的复杂&#xff0c;相应监控要求也不断提升&#xff0c;如今这些…...

java斗牛,咋金花

无聊时间&#xff0c;打发下游戏 简单说下思路 目录 1.创建牌对象 2.创建52张牌&#xff0c;不包含大小王 3.洗牌 4.发牌 1.创建牌对象 2.创建52张牌&#xff0c;不包含大小王 3.洗牌 4.发牌 /*** 扑克牌*/ public class Poker {/*** 花色*/private String cardSuits…...

深信服技术认证“SCSA-S”划重点:信息收集

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师…...

代码逻辑修复与其他爬虫ip库的应用

在一个项目中&#xff0c;由于需要设置 http_proxy 来爬虫IP访问网络&#xff0c;但在使用 requests 库下载文件时遇到了问题。具体表现为在执行 Python 脚本时&#xff0c;程序会阻塞并最终超时&#xff0c;无法正常完成文件下载。 解决方案 针对这个问题&#xff0c;我们可以…...

字符串结尾空格比较相关参数BLANK_PAD_MODE(DM8:达梦数据库)

DM8:达梦数据库 字符串结尾空格比较相关参数BLANK_PAD_MODE 环境介绍1 BLANK_PAD_MODE01.1 初始化数据库1.2 创建测试表 T0 2 BLANK_PAD_MODE12.1 初始化数据库2.2 创建测试表 T1 3 BLANK_PAD_MODE只对字段varchar类型生效3.1 BLANK_PAD_MODE 对char 类型对比无效3.2 在两个数据…...

微型计算机原理MOOC题

一、8254 1.掉坑了&#xff0c;AL传到端口不意味着一定传到的是低位&#xff0c;要看控制字D5和D4&#xff0c;10是只写高位&#xff0c;所以是0A00.。。 2. 3. 4.待解决&#xff1a;...

TensorFlow实战教程(十八)-Keras搭建卷积神经网络及CNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras实现分类学习,以MNIST数字图片为例进行讲解。本篇文章详细讲解了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。基础性文章,希望对您有所帮助! 一…...

uniapp为什么能支持多端开发?uniapp底层是怎么做的?

文章目录 前言uniapp为什么能支持多端开发&#xff1f;uniapp底层是怎么做条件编译uniapp的语法uniapp如何编译为不同端的代码uniapp的底层是如何做平台特性适配的呢&#xff1f;后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;uniapp &…...

《数据仓库入门实践》

前言&#xff1a; 1、问什么要写这篇博客&#xff1f; 随着自己在数仓岗位工作的年限增加&#xff0c;对数仓的理解和认知也在发生着变化 所有用这篇博客来记录工作中用到的知识点与经验 2、这篇博客主要记录了哪些内容&#xff1f; 在日常工作中&#xff0c;发现刚接触不久数仓…...

什么是arguments对象?

arguments 对象是 JavaScript 中的一个特殊对象&#xff0c;它包含了函数被调用时传入的所有参数。arguments 对象是一个类数组对象&#xff0c;它有一个 length 属性和按数字索引的元素。 每个函数在执行时都会自动创建一个 arguments 对象。我们可以通过arguments去访问参数…...

Java LinkedList链表、HashSet、HashMap

一、Java LinkedList&#xff1a; 链表&#xff08;LinkedList&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;在每一个节点里存储下一个节点的地址。链表分为单向链表和双向链表。单向链表包含两个值&#xff1a;当前节点的值和指向下一个节点的链…...

Linux中清除cache/buffer方法

1、查看Linux中的cache/buffer情况&#xff1a; free -h 2、仅清除页面缓存PageCache方法&#xff1a; echo 1 > /proc/sys/vm/drop_caches 3、清除目录项和inode节点&#xff1a; echo 2 > /proc/sys/vm/drop_caches 4、清除页面缓存、目录项和inode节点&#xff1a;…...

github批量仓库克隆,git clone某个用户的所有仓库

利用github的api工具&#xff0c; 首先拿到用户名为kevin的所有仓库的url&#xff1a; curl "https://api.github.com/users/kevin/repos?per_page100&&page1" | grep -w clone_url >clone.txt过滤一下&#xff1a; grep -o https://[^"]* clone…...

ARM Core Tiles系统架构与开发实践指南

1. ARM Core Tiles独立使用指南&#xff1a;系统架构与核心原理1.1 ARM Core Tiles技术背景与应用场景ARM Core Tiles是ARM公司推出的模块化开发平台核心组件&#xff0c;主要用于嵌入式处理器系统的原型验证和开发。我第一次接触Core Tiles是在2006年参与一个工业控制器项目时…...

告别手忙脚乱!用立创EDA焊接辅助工具,像玩游戏一样轻松焊接你的PCB板

像玩游戏一样轻松焊接&#xff1a;立创EDA焊接辅助工具实战指南 焊接电路板对许多电子爱好者来说&#xff0c;既是创作的乐趣所在&#xff0c;也是容易出错的技术难点。传统焊接过程中&#xff0c;我们需要不断对照原理图、BOM表和实物板子&#xff0c;稍不留神就可能焊错元件或…...

Cosmos-Reason1-7B参数详解:Top-P=0.95在开放性物理问题中的平衡表现

Cosmos-Reason1-7B参数详解&#xff1a;Top-P0.95在开放性物理问题中的平衡表现 1. 引言 当你让一个AI模型去分析一张图片&#xff0c;判断“这个机器人手臂能安全地拿起那个玻璃杯吗&#xff1f;”&#xff0c;你期望的答案是什么&#xff1f;是一个简单的是或否&#xff0c…...

如何用Python指南python-guide构建高效A/B测试与实验平台:完整实践教程

如何用Python指南python-guide构建高效A/B测试与实验平台&#xff1a;完整实践教程 【免费下载链接】python-guide Python best practices guidebook, written for humans. 项目地址: https://gitcode.com/gh_mirrors/py/python-guide Python指南&#xff08;python-gu…...

告别模组管理混乱!XXMI启动器:一站式管理6大二次元游戏的终极解决方案

告别模组管理混乱&#xff01;XXMI启动器&#xff1a;一站式管理6大二次元游戏的终极解决方案 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为不同游戏安装不同的模组工具…...

AI系统偏见分类与缓解实战指南

1. 项目概述"Bias Taxonomy"这个项目名称直译为"偏见分类学"&#xff0c;但它的实际内涵要丰富得多。作为一名在AI伦理领域工作多年的从业者&#xff0c;我见过太多开发者只关注模型准确率而忽视系统偏见的情况。这个项目本质上是一份面向AI开发者的实用指…...

多语言预训练模型的高效迁移与适配技术解析

1. 项目概述这个研究课题直指当前NLP领域最前沿也最实用的方向——如何让预训练语言模型在不同语言间实现高效迁移和适配。我在过去三年参与过多个跨国企业的多语言NLP项目&#xff0c;深刻体会到传统单语模型在跨语言场景中的局限性。比如去年为某跨境电商平台搭建客服系统时&…...

基于Simulink的光伏电池仿真模型搭建——从四参数工程数学模型到S-Function实现与子系统封装

基于Simulink的光伏电池仿真模型搭建——从四参数工程数学模型到S-Function实现与子系统封装 摘要 光伏电池的输出特性具有强烈的非线性和环境依赖性,准确建立其仿真模型是开展光伏系统设计、最大功率点跟踪算法验证及并网发电系统研究的基础。本文以RX-DBG型单晶硅光伏组件…...

为什么我建议每个测试从业者都去学点产品思维

在快速迭代、体验至上的现代软件工业体系中&#xff0c;传统意义上的“职能竖井”正逐渐被打破。对于软件测试从业者而言&#xff0c;仅精通测试技术、熟稔缺陷追踪&#xff0c;已不足以应对日益复杂的质量保障挑战。本文旨在面向广大的软件测试同仁&#xff0c;深入探讨一个核…...

LLM智能体开发中的数据标准化实践与ADP协议解析

1. 项目背景与核心价值在大型语言模型&#xff08;LLM&#xff09;智能体开发领域&#xff0c;微调数据集的质量和标准化程度直接决定了智能体的最终表现。当前行业面临的核心痛点在于&#xff1a;不同研究团队和企业在构建智能体时&#xff0c;往往使用各自私有格式的数据集&a…...