集合-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官网,进入后点击“立即下载”࿰…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
