List 源码分析

news/2024/4/20 12:47:02/文章来源:https://blog.csdn.net/oracle8090/article/details/129205921

内容来自尚硅谷

一、ArrayList

1. ArrayList的特点:

> 实现了List接口,存储有序的、可以重复的数据

> 底层使用Object[]数组存储

> 线程不安全的

2. ArrayList源码解析:

2.1 jdk7版本:(以jdk1.7.0_07为例)

//如下代码的执行:底层会初始化数组,数组的长度为10。Object[] elementData = new Object[10];

ArrayList<String> list = new ArrayList<>();

list.add("AA"); //elementData[0] = "AA";

list.add("BB");//elementData[1] = "BB";

...

当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组

中的元素复制到新的数组中。

2.2 jdk8版本:(以jdk1.8.0_271为例)

//如下代码的执行:底层会初始化数组,即:Object[] elementData = new Object[]{};

ArrayList<String> list = new ArrayList<>();

list.add("AA"); //首次添加元素时,会初始化数组elementData = new Object[10];elementData[0] = "AA";

list.add("BB");//elementData[1] = "BB";

...

当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组

中的元素复制到新的数组中。

小结:

jdk1.7.0_07版本中:ArrayList类似于饿汉式

jdk1.8.0_271版本中:ArrayList类似于懒汉式

二、Vector

1. Vector的特点:

> 实现了List接口,存储有序的、可以重复的数据

> 底层使用Object[]数组存储

> 线程安全的

2. Vector源码解析:(以jdk1.8.0_271为例)

Vector v = new Vector(); //底层初始化数组,长度为10.Object[] elementData = new Object[10];

v.add("AA"); //elementData[0] = "AA";

v.add("BB");//elementData[1] = "BB";

...

//底层初始化数组,长度为10.Object[] elementData = new Object[10];

当添加第11个元素时,需要扩容。默认扩容为原来的2倍。

三、LinkedList

1. LinkedList的特点:

> 实现了List接口,存储有序的、可以重复的数据

> 底层使用双向链表存储

> 线程不安全的

2. LinkedList在jdk8中的源码解析:

LinkedList<String> list = new LinkedList<>(); //底层也没做啥

list.add("AA"); //将"AA"封装到一个Node对象1中,list对象的属性first、last都指向此Node对象1。

list.add("BB"); //将"BB"封装到一个Node对象2中,对象1和对象2构成一个双向链表,同时last指向此Node对象2

...

因为LinkedList使用的是双向链表,不需要考虑扩容问题。

LinkedList内部声明:

private static class Node<E> {

E item;

Node<E> next;

Node<E> prev;

}

3. LinkedList是否存在扩容问题?No!

四、启示与开发建议

1. Vector基本不使用了。

2. ArrayList底层使用数组结构,查找和添加(尾部添加)操作效率高,时间复杂度为O(1)

删除和插入操作效率低,时间复杂度为O(n)

LinkedList底层使用双向链表结构,删除和插入操作效率高,时间复杂度为O(1)

查找和添加(尾部添加)操作效率高,时间复杂度为O(n) (有可能添加操作是O(1))

3. 在选择了ArrayList的前提下,new ArrayList() : 底层创建长度为10的数组。

new ArrayList(int capacity):底层创建指定capacity长度的数组。

如果开发中,大体确认数组的长度,则推荐使用ArrayList(int capacity)这个构造器,避免了底层的扩容、复制数组的操作。

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

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

相关文章

Wireshark抓包

Wireshark 1 抓包时间显示格式 2 界面显示列设置 3 protocol协议解析 4 过滤器 tcp.port&#xff1a;TCP端口tcp.dstport&#xff1a;TCP目的端口tcp.srcport&#xff1a;TCP源端口udp.port&#xff1a;UDP端口udp.dstport&#xff1a;UDP目的端口udp.srcport&#xff1a;UDP…

月薪过3W的软件测试工程师,都是怎么做到的?

对任何职业而言&#xff0c;薪资始终都会是众多追求的重要部分。前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&#xff0c;我说的是最基础的功能测试的岗位…

良许也成为砖家啦~

大家好&#xff0c;我是良许。 没错&#xff0c;良许成为砖家啦&#xff0c;绝不是口嗨&#xff0c;有图有真相&#xff01; 有人会说&#xff0c;咦&#xff0c;这明明是严宇啊&#xff0c;跟你良许有啥关系&#xff1f; 额。。老读者应该知道良许的来历—— 鄙人真名严宇&a…

Python-datetime、time包常用功能汇总

目录基础知识时间格式有哪些&#xff1f;Python中的时间格式化时间戳datetimedatedatetimetimedeltatime常用获取今天凌晨字符串&#xff1f;将一个时间格式的字符串转为时间戳将一个时间戳转为指定格式的字符串全部代码参考基础知识 时间格式有哪些&#xff1f; 「格林威治标…

最新OpenMVG编译安装与逐命令运行增量式和全局式SfM教程

openmvg是一个轻便的可以逐步运行的SfM开源库&#xff0c;它同时实现了增量式和全局式两种算法。 说明文档地址&#xff1a;https://openmvg.readthedocs.io/en/latest/ github主页地址&#xff1a;https://github.com/openMVG/openMVG 1 编译安装 openmvg的安装比较简单&…

Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Feb 2023)

Windows 11, version 22H2&#xff0c;2023 年 2 月 更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 全新推出 Windows 11 全新 Windows 体验&#x…

论坛项目小程序和h5登录

项目中安装uview出现npm安装uview 直接报错&#xff1a;创建一个package.json配置文件在进行安装。cmd到项目。初始化一个package.json文件&#xff08;vue项目的配置文件&#xff09; npm init --yes 安装uview项目点击关注进入管页面&#xff0c;需要验证用户是否登录查用户是…

Linux学习(8)Linux文件与目录管理

以下内容转载自鸟哥的Linux私房菜 绝对路径与相对路径 绝对路径&#xff1a;路径的写法『一定由根目录 / 写起』&#xff0c;例如&#xff1a; /usr/share/doc 这个目录。相对路径&#xff1a;路径的写法『不是由 / 写起』&#xff0c;例如由 /usr/share/doc 要到 /usr/share…

Java实现在线沟通功能

文章目录1、介绍 和 特点2、整合SpringBoot2.1、导入依赖2.2、websocket 配置类2.3、消息处理类2.4、启动服务2.5、前端代码&#xff1a;张三2.6、前端代码&#xff1a;李四3、效果4、小结1、介绍 和 特点 t-io是基于JVM的网络编程框架&#xff0c;和netty属同类&#xff0c;所…

【LeetCode】剑指 Offer 14- I. 剪绳子 p96 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/jian-sheng-zi-lcof/ 1. 题目介绍&#xff08;14- I. 剪绳子&#xff09; 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n>1并且m>1&#xff09;&#xff0c…

计算机网络你都懂了吗

文章目录一、计算机网络的定义简单定义通用定义二、计算机网络通信过程三、什么是网络协议&#xff08;Protocol&#xff09;四、网络协议组成及功能一、计算机网络的定义 简单定义 计算机网络是一些相互连接的、自治的计算机系统的集合。 通用定义 将处于不同位置并具有独…

MySQL简介、M有SQL的存储引擎、表、字段和数据

Java知识点总结&#xff1a;想看的可以从这里进入 目录2、MySQL特性介绍2.1、MySQL简介2.2、存储引擎2.3、表、字段、数据2、MySQL特性介绍 2.1、MySQL简介 MySQL 是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;于2009年被 Oracle 公司收购。它是一种关…

Hive---排序

Hive语法之排序 文章目录Hive语法之排序全局排序&#xff08;Order By&#xff09;升序降序按照别名排序多个列排序每个 Reduce 内部排序&#xff08;Sort By&#xff09;设置 reduce 个数查看设置 reduce 个数分区排序&#xff08;Distribute By&#xff09;设置 reduce 个数簇…

仅花半年时间,他从外包月薪5K到阿里月薪15K,究竟经历了什么?

背景介绍&#xff1a;“渣渣”二本&#xff0c;95年Java程序员**外包类型&#xff1a;**传统外包公司**内容简介&#xff1a;**朋友从一个传统公司是如何修仙到阿里巴巴&#xff1f;分享一些他的真实经历&#xff0c;希望对你有帮助。**学习路线&#xff1a;**基础&#xff08;…

为什么HR眼中,Python是真正的简历加分项?

教育部在发布的关于《2023届高校毕业生预计1158万 校园招聘月启动》文中明确指出&#xff1a;“2023届高校毕业生预计1158万&#xff0c;同比增加82万人”。除开考研、考公的少数同学&#xff0c;几百万大军拼命往大企业投简历&#xff0c;求职竞争十分激烈。 来源&#xff1a…

优化长尾关键词有什么好处?在线长尾关键词挖掘

​想知道为什么要使用长尾关键词&#xff1f; 好吧&#xff0c;它们可以帮助你轻松找到合适的受众。 ​ 1.获得更高的转化率 长尾关键词对于搜索特定信息更有用。使用长尾关键词时通常会获得更高的转化率&#xff0c;因为内容与受众的需求更相关。 举个例子&#xff1a;你正…

数影周报:动视暴雪疑似数据泄露,数据出境安全评估申报最新进展

本周看点&#xff1a;动视暴雪疑似员工敏感信息及游戏数据泄露&#xff1b;谷歌云计算部门&#xff1a;两名员工合用一个工位&#xff1b;数据出境安全评估申报最新进展&#xff1b;TikTok Shop东南亚商城在泰国和菲律宾公布&#xff1b;智己汽车获九大金融机构50亿元贷款签约.…

Redis:实现全局唯一ID

Redis&#xff1a;实现全局唯一ID一. 概述二. 实现&#xff08;1&#xff09;获取初始时间戳&#xff08;2&#xff09;生成全局ID三. 测试为什么可以实现全局唯一&#xff1f;其他唯一ID策略补充&#xff1a;countDownLatch一. 概述 全局ID生成器&#xff1a;是一种在【分布式…

RK3568平台开发系列讲解(驱动基础篇)中断子系统框架

🚀返回专栏总目录 文章目录 一、中断硬件的组成二、软件框架三、中断常见概念沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中断是指 CPU 正常运行期间,由于内外部事件或程序预先安排的事件,引起的 CPU 暂时停止正在运行的程序, 转而为该内部或外部预先安排的事…

基于Frenet优化轨迹的⾃动驾驶动作规划⽅法

动作规划&#xff08;Motion Control&#xff09;在⾃动驾驶汽⻋规划模块的最底层&#xff0c;它负责根据当前配置和⽬标配置⽣成⼀序列的动作&#xff0c;本⽂介绍⼀种基于Frenet坐标系的优化轨迹动作规划⽅法&#xff0c;该⽅法在⾼速情况下的ACC辅助驾驶和⽆⼈驾驶都具有较强…