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

集合-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.什么是数组&#xff1f; 数组是一种用连续的内存空间存储相同类型数据的线性数据结构。 2.为什么数组下标是从0开始&#xff1f; &#xff08;1&#xff09;数组根据下标查找元素是基于寻址公式&#xff1a;元素地址数组首地址索引i*数组存储数据类型的大小 &am…...

42-1 应急响应之账户排查

一、用户信息排查 在服务器被入侵后,攻击者可能会建立相关账户(有时是隐藏或克隆账户),方便进行远程控制。攻击者会采用的方法主要有如下几种: 直接建立一个新的账户:攻击者直接创建一个新的账户,有时为了混淆视听,账户名称与系统常用名称相似。 激活一个系统中的默认…...

Python3 笔记:sort() 和 sorted() 的区别

1、sort() 可以对列表中的元素进行排序&#xff0c;会改变原列表&#xff0c;之前的顺序不复存在。 list.sort&#xff08;key&#xff0c; reverse None&#xff09; key&#xff1a;默认值是None&#xff0c;可指定项目进行排序&#xff0c;此参数可省略。 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 存储 引擎 怎么看&#xff1f; 适用于MyISAM存储引…...

SpringBoot之@Builder 注解

&#xff08;1&#xff09;Builder 生成的构造器不是完美的&#xff0c;如果没有提供必须的参数&#xff0c;构造器可能会创建出不完整或者不合法的对象&#xff0c;导致代码报错。 Builder 注解产生的 Builder 类的构造方法默认并不能限定必传参数。 &#xff08;2&#xff…...

云计算的能源消耗如何影响环境?

嗨&#xff0c;亲爱的读者朋友们&#xff0c;今天我们要聊一聊云计算的能源消耗对环境的影响。随着科技的飞速发展&#xff0c;云计算已经成为了企业和个人处理数据的首选方式。但是&#xff0c;你可曾想过&#xff0c;这些“云”究竟消耗了多少能源&#xff0c;对我们的环境又…...

openwrt设置开机自启 tailscale为例

首先下载 tailscale 到 /root 目录下&#xff0c;并按照以下命令运行一次 /root/tailscale/tailscaled --state/root/tailscale/tailscaled.state & /root/tailscale/tailscale up &弹出登录地址并授权即可 创建一个启动脚本位置在/etc/init.d下 vim /etc/init.d/ta…...

副业树洞聊天项目/树洞倾诉/陪陪系统源码/树洞源码下载搭建

随着社会的发展和人们生活水平的提高&#xff0c;越来越多的人在面临心理压力、情感困扰或生活困境时&#xff0c;需要一个可以宣泄、倾诉和寻求支持的平台。而传统的人际交往方式往往会遇到难以排解的问题&#xff0c;比如担心被他人知晓自己的隐私等&#xff0c;这就导致了人…...

UWB论文:Introduction to Impulse Radio UWB Seamless Access Systems(2):脉冲;超宽带;测距;定位

3) 测距/接收器 像全球定位系统&#xff08;GPS&#xff09;这样的系统依赖于单向测距One Way Ranging&#xff08;OWR&#xff09;&#xff0c;其中多个卫星&#xff08;代表固定节点&#xff0c;称为锚点anchors&#xff09;定期传输同步的无线电数据包集合&#xff0c;这允许…...

Spring MVC/Web

1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;也是Spring框架的一部分。它提供了灵活可扩展的MVC架构&#xff0c;方便开发者构建高性能的Web应用程序&#xff0c;并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC&#xff08;Model…...

C++中获取int最大与最小值(补)

上文中&#xff0c;我们学习了C中获取int最大与最小值的两种方法&#xff1a;C库和移位运算&#xff0c;这篇文章将解决在移位运算中遇到的各种报错&#xff0c;并提出一种新的生成int最值的方法 上文链接&#xff1a;http://t.csdnimg.cn/cn7Ad 移位运算取最值常见报错 Dev…...

一个开源的工具类轮子是怎么造出来的

心路历程 为什么要做 在22年9月的某一天&#xff0c;在公司开需求评审时&#xff0c;接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员&#xff0c;在遇到这些问题时&#xff0c;第一反应是去github上找找有没有类似的开源框架。但是&#xff0c;出乎我意料…...

零基础学Java第二十二天之迭代器 Iterator

迭代器 Iterator 的理解和相关集合 使用 1、理解 迭代器&#xff08;Iterator&#xff09;是设计模式中的一种&#xff0c;它允许程序员遍历容器&#xff08;例如列表、集合等&#xff09;中的元素&#xff0c;而无需了解容器底层的实现细节。在编程中&#xff0c;迭代器提供了…...

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回&#xff0c;而不需要等待消息被处理完毕&#xff0c;这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构&#xff0c;通常涉及多个服务之间的相互调用&#xff0c;如果通信只是在少数几个微…...

基于SSM的大学生兼职管理系统

基于SSM的大学生兼职管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;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 适用范围&#xff1a;快速、频繁地计算一个索引区间内的元素之和 303 区域和检索&#xff1a;数组不可变 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论文摘要的翻译 在这种完全测试时适应的情况下&#xff0c;模型只有测试数据和自身参数。我们建议通过测试熵最小化&#xff08;tent&#xff09;进行适应&…...

Java期末复习指南(1):知识点总结+思维导图,考试速成!

&#x1f516;面向对象 &#x1f4d6; Java作为面向对象的编程语言&#xff0c;我们首先必须要了解类和对象的概念&#xff0c;本章的所有内容和知识都是围绕类和对象展开的&#xff01; ▐ 思维导图1 ▐ 类和对象的概念 • 简单来说&#xff0c;类就是对具有相同特征的一类事…...

OpenMV学习笔记1——IDE安装与起步

目录 一、OpenMV IDE下载 二、OpenMV界面 三、Hello World&#xff01; 四、将代码烧录到OpenMV实现脱机运行 五、插SD卡&#xff08;为什么买的时候没送&#xff1f;&#xff09; 一、OpenMV IDE下载 浏览器搜索OpenMV官网&#xff0c;进入后点击“立即下载”&#xff0…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...