集合-1 数组ArrayListLinkedList
一.数组
1.什么是数组?
数组是一种用连续的内存空间存储相同类型数据的线性数据结构。
2.为什么数组下标是从0开始?
(1)数组根据下标查找元素是基于寻址公式:元素地址=数组首地址+索引i*数组存储数据类型的大小
(2)如果下标从0开始,则寻址公式应改为:元素地址=数组首地址+(i-1)*数组存储数据类型的大小;对cpu而言多了一个(i-1)的操作,性能下降。
3.数组查找元素的时间复杂度
(1)已知下标:O(1)
(2)未知下标:O(n)
(3)未知下标但排序:根据二分法查找是O(logn)
(4)插入和删除时,为了保证在内存存储的连续性,需要数组元素,平均时间复杂度为O(n)
二.ArrayList
1.ArrayList的底层实现原理是什么?
(1)ArrayList底层是用动态的数组实现的。
(2)ArrayList创建时,若未指定容量,则初始化数组长度为0;第一次添加数据时才将数组长度扩容为10。
(3)后续的每次扩容,都将数组长度扩容为原来的1.5倍;每次扩容都需要将原数组元素拷贝到新数组。
(4)ArrayList在添加数据时:
a.计算数组当前已存储容量size,若size+1>length,则调用grow()方法进行扩容(扩容为原来的1.5倍)。
b.将新添加的数据存储到数组的size位置上,添加成功返回布尔值
2.ArrayList list = new ArrayList(10);代码中list扩容了几次?
(1)ArrayList有三种构造方法:
a.ArrayList(int initialCapacity):带初始化容量的构造函数,将数组的容量初始化为initialCapacity;
b.ArrayList():无参构造函数,数组容量初始化为0,第一次添加元素时才扩容为10;
c.ArrayList(Collection<?extends E> c):将c转化为ArrayList
(2)代码中是使用了ArrayList的带初始化容量的构造函数,并未进行扩容。
3.如何实现数组和List之间的转换?
(1)数组转List:调用JDK中的工具类Arrays中的asList()方法。
(2)List转数组:调用List类中的toArray()方法。若toArray()方法不传参,则返回一个Object数组;若传入一个已经初始化长度的数组,则将List中的数据存到该数组并返回该数组。
4.通过Arrays.asList()将数组转List后,若修改数组内容,List会受影响吗?
(1)asList()的实现原理是通过Arrays类中的一个内部类ArrayList来将数组包装成一个ArrayList;
(2)asList()方法会将ArrayList中的数组指向传入的数组,再将ArrayList对象返回,以此来实现将数组转化成List。
(3)这个指向是一个引用传递,ArrayList的数组和传入的数组指向同一块地址,因此修改数组内容,List会受影响。
5.ArrayList 和 Arrays类的内部类Arrays.ArrayList的区别
(1)add方法
a.ArrayList和Arrays.ArrayList都继承了抽象类AbstractList;
b.AbstractList中的add()方法默认为若子类未重写该方法,则使用时会抛出UnsupportedOperationException异常
c.ArrayList重写了add()方法,可以有添加元素操作
d.Arrays.ArrayList未重写add()方法,无法添加元素
******e.由于Arrays.asList()返回的是Arrays.ArrayList对象,因此通过这种方式将数组转成的List是无法添加元素的。
(2)构造参数为数组或集合时
a.ArrayList只能接收Collection
b.Arrays.ArrayList能接收数组E[]
6.通过List类的toArray()将List转成数组后,若修改List内容,数组会受影响吗?
不会受影响,toArray()的实现原理是将List中的数组进行拷贝,并返回一个新数组对象。返回的数组与List中的数组不指向同一块地址,因此互不影响。
7.ArrayList和LinkedList的区别是什么?
1.底层数据结构
(1)ArrayList底层是用动态的数组实现的
(2)LinkedList底层是用双向链表实现的
2.操作数据的效率不同
(1)查
a.已知索引的情况下,ArrayList根据寻址公式查找,效率是O(1);LnkedList是遍历查找,效率是O(n)。
b.未知索引的情况下,ArrayList和LinkedList都是遍历查找,效率都是O(n)。
(2)增删
a.ArrayList进行尾部增删效率是O(1),其他位置的增删都需要挪动数组,效率是O(n)。
b.LinkedList进行头尾增删效率是O(1),其他位置的增删都需要遍历链表,效率是O(n)。
3.内存空间占用
(1)ArrayList底层是数组,在内存中是连续存储的,节省内存空间。
(2)LinkedList底层是双向链表,在内存中是离散存储的,还需额外存储前后两个节点的地址,更占用内存空间
4.线程安全
ArrayList和LinkedList都是线程不安全的,若要保证线程安全,有两种方案:
(1)在方法内定义使用,对于局部变量是线程安全的。
(2)使用Collections.synchronizedList(new ArrayList<>())或Collections.synchronizedList(new LinkedList<>())构建线程安全的List,该方法就是创建加了synchronized锁的List,线程安全但操作性能下降。
相关文章:
集合-1 数组ArrayListLinkedList
一.数组 1.什么是数组? 数组是一种用连续的内存空间存储相同类型数据的线性数据结构。 2.为什么数组下标是从0开始? (1)数组根据下标查找元素是基于寻址公式:元素地址数组首地址索引i*数组存储数据类型的大小 &am…...
42-1 应急响应之账户排查
一、用户信息排查 在服务器被入侵后,攻击者可能会建立相关账户(有时是隐藏或克隆账户),方便进行远程控制。攻击者会采用的方法主要有如下几种: 直接建立一个新的账户:攻击者直接创建一个新的账户,有时为了混淆视听,账户名称与系统常用名称相似。 激活一个系统中的默认…...
Python3 笔记:sort() 和 sorted() 的区别
1、sort() 可以对列表中的元素进行排序,会改变原列表,之前的顺序不复存在。 list.sort(key, reverse None) key:默认值是None,可指定项目进行排序,此参数可省略。 reverse&#…...
vue 引入 emoji 表情包
vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…...
mysql 数据库 增量备份
mysql 数据库 增量备份 https://dev.mysql.com/doc/mysql-enterprise-backup/8.0/en/mysqlbackup.incremental.html 和版本 有关系啊 xtrabackup mysql增量备份与恢复使用详解 https://www.jb51.net/database/297844fzd.htm 存储 引擎 怎么看? 适用于MyISAM存储引…...
SpringBoot之@Builder 注解
(1)Builder 生成的构造器不是完美的,如果没有提供必须的参数,构造器可能会创建出不完整或者不合法的对象,导致代码报错。 Builder 注解产生的 Builder 类的构造方法默认并不能限定必传参数。 (2ÿ…...
云计算的能源消耗如何影响环境?
嗨,亲爱的读者朋友们,今天我们要聊一聊云计算的能源消耗对环境的影响。随着科技的飞速发展,云计算已经成为了企业和个人处理数据的首选方式。但是,你可曾想过,这些“云”究竟消耗了多少能源,对我们的环境又…...
openwrt设置开机自启 tailscale为例
首先下载 tailscale 到 /root 目录下,并按照以下命令运行一次 /root/tailscale/tailscaled --state/root/tailscale/tailscaled.state & /root/tailscale/tailscale up &弹出登录地址并授权即可 创建一个启动脚本位置在/etc/init.d下 vim /etc/init.d/ta…...
副业树洞聊天项目/树洞倾诉/陪陪系统源码/树洞源码下载搭建
随着社会的发展和人们生活水平的提高,越来越多的人在面临心理压力、情感困扰或生活困境时,需要一个可以宣泄、倾诉和寻求支持的平台。而传统的人际交往方式往往会遇到难以排解的问题,比如担心被他人知晓自己的隐私等,这就导致了人…...
UWB论文:Introduction to Impulse Radio UWB Seamless Access Systems(2):脉冲;超宽带;测距;定位
3) 测距/接收器 像全球定位系统(GPS)这样的系统依赖于单向测距One Way Ranging(OWR),其中多个卫星(代表固定节点,称为锚点anchors)定期传输同步的无线电数据包集合,这允许…...
Spring MVC/Web
1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC(Model…...
C++中获取int最大与最小值(补)
上文中,我们学习了C中获取int最大与最小值的两种方法:C库和移位运算,这篇文章将解决在移位运算中遇到的各种报错,并提出一种新的生成int最值的方法 上文链接:http://t.csdnimg.cn/cn7Ad 移位运算取最值常见报错 Dev…...
一个开源的工具类轮子是怎么造出来的
心路历程 为什么要做 在22年9月的某一天,在公司开需求评审时,接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员,在遇到这些问题时,第一反应是去github上找找有没有类似的开源框架。但是,出乎我意料…...
零基础学Java第二十二天之迭代器 Iterator
迭代器 Iterator 的理解和相关集合 使用 1、理解 迭代器(Iterator)是设计模式中的一种,它允许程序员遍历容器(例如列表、集合等)中的元素,而无需了解容器底层的实现细节。在编程中,迭代器提供了…...
微服务架构-异步消息传递设计模式
微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回,而不需要等待消息被处理完毕,这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构,通常涉及多个服务之间的相互调用,如果通信只是在少数几个微…...
基于SSM的大学生兼职管理系统
基于SSM的大学生兼职管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 企业界面 前台学生界面 管理员界面 摘要 随着大学生兼职市场的日益繁…...
leetcode刷题记录:前缀和
https://labuladong.online/algo/problem-set/perfix-sum/#%E8%A7%A3%E6%B3%95%E4%BB%A3%E7%A0%81-3 适用范围:快速、频繁地计算一个索引区间内的元素之和 303 区域和检索:数组不可变 https://leetcode.cn/problems/range-sum-query-immutable/ class …...
TENT: FULLY TEST-TIME ADAPTATION BY ENTROPY MINIMIZATION--论文笔记
论文笔记 资料 1.代码地址 https://github.com/DequanWang/tent 2.论文地址 https://arxiv.org/abs/2006.10726 1论文摘要的翻译 在这种完全测试时适应的情况下,模型只有测试数据和自身参数。我们建议通过测试熵最小化(tent)进行适应&…...
Java期末复习指南(1):知识点总结+思维导图,考试速成!
🔖面向对象 📖 Java作为面向对象的编程语言,我们首先必须要了解类和对象的概念,本章的所有内容和知识都是围绕类和对象展开的! ▐ 思维导图1 ▐ 类和对象的概念 • 简单来说,类就是对具有相同特征的一类事…...
OpenMV学习笔记1——IDE安装与起步
目录 一、OpenMV IDE下载 二、OpenMV界面 三、Hello World! 四、将代码烧录到OpenMV实现脱机运行 五、插SD卡(为什么买的时候没送?) 一、OpenMV IDE下载 浏览器搜索OpenMV官网,进入后点击“立即下载”࿰…...
高效构建个性化Obsidian知识管理系统:从模板到实践的全面指南
高效构建个性化Obsidian知识管理系统:从模板到实践的全面指南 【免费下载链接】kepano-obsidian My personal Obsidian vault template. A bottom-up approach to note-taking and organizing things I am interested in. 项目地址: https://gitcode.com/gh_mirro…...
构建企业级AI客服系统:从知识库集成到无缝转人工的实战指南
1. 企业级AI客服系统架构设计 第一次搭建AI客服系统时,我犯了个典型错误——直接调用大模型API就开始开发前端界面。结果上线后才发现,当用户量超过50人时响应速度直线下降,转人工功能更是形同虚设。这个教训让我明白,企业级系统必…...
mT5分类增强版中文-base效果惊艳:同一输入生成‘正式/口语/幽默’三风格文本示例
mT5分类增强版中文-base效果惊艳:同一输入生成‘正式/口语/幽默’三风格文本示例 1. 模型介绍:零样本学习的文本增强利器 mT5分类增强版中文-base是一个基于mT5架构的文本增强模型,专门针对中文场景进行了深度优化。这个模型最大的特点是采…...
OpenClaw成本优化方案:Qwen3.5-9B-AWQ-4bit自部署省下80%Token
OpenClaw成本优化方案:Qwen3.5-9B-AWQ-4bit自部署省下80%Token 1. 为什么需要关注OpenClaw的Token消耗 第一次用OpenClaw完成图片处理任务时,我的信用卡账单给我上了深刻的一课——单月API调用费用直接突破2000元。这个数字让我意识到:如果…...
实战演练:基于快马平台开发结合openclaw配置模型的工业分拣模拟系统
最近在做一个工业分拣系统的模拟项目,尝试用openclaw配置模型来实现对不同形状物体的智能抓取。整个过程在InsCode(快马)平台上完成,发现这个工具特别适合快速搭建这类机器人控制原型。记录下具体实现过程: 场景搭建 首先用三维引擎创建了一个…...
Windows 10 PL-2303串口驱动终极修复指南:告别老旧芯片兼容性问题
Windows 10 PL-2303串口驱动终极修复指南:告别老旧芯片兼容性问题 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 还在为Windows 10系统下PL-2303串口适配器…...
VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存
VS2015C实战:海康MVS工业相机多机同步采图全流程解析 工业视觉检测系统中,多相机同步采图是个经典需求。上周帮朋友调试8台海康威视相机组成的检测线时,发现网上完整案例实在太少。今天我就以VS2015开发环境为例,带大家深入MVS安装…...
模型蒸馏与量化:为什么大厂急需能把大模型跑在边缘端的SDE?
在2026年的北美科技求职市场中,人工智能的下半场战役已经悄然转移了阵地。当行业内绝大多数求职者还在简历上堆砌“熟练调用大语言模型API”或“基于LangChain构建应用”时,北美头部科技公司(如Apple、Google、Meta)的招聘重心已经…...
告别单调闪烁!用GD32F303的TIMER高级功能玩转PWM:实现S形曲线呼吸灯与多灯同步效果
解锁GD32F303定时器高阶玩法:S形曲线PWM与多灯协同控制艺术 呼吸灯效果在嵌入式设备中早已司空见惯,但大多数实现仍停留在简单的线性渐变阶段。当LED亮度以恒定速率变化时,人眼会感知到明显的"机械感"——就像早期数字音乐缺少模拟…...
2025版等级保护测评报告模板:风险导向与合规深化的实践指南
1. 2025版等级保护测评报告模板的核心变革 如果你最近接触过等级保护测评工作,一定会注意到2025版报告模板带来的显著变化。这个版本最大的特点就是从过去的"得分导向"彻底转向了"风险导向"。在实际工作中,我发现很多企业安全负责人…...
