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

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系

List

  • List是一个接口,不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList
  • 站在数据结构的角度看,List就是一个线性表。常见的线性表:顺序表、链表、栈、队列等

线性表

  • 线性表是n个具有相同特性的数据元素的有限序列。
  • 它在逻辑上是线性结构,但是在物理结构上不一定是连续的
  • 线性表在物理存储时,通常以数组和链式结构的形式存储

List与ArrayList的关系

  • 从“List是一个接口”的方面来看,ArrayList是List接口的一个实现类
  • 从“List是一个线性表”的方面来看,ArrayList是一个以数组形式存储的线性表(这种线性表也被称为顺序表)

ArrayList

关于ArrayList的说明

  • ArrayList是以泛型方式实现的,使用时必须要先实例化
  • ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  • ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  • ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  • ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
  • 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList

认识ArrayList

构造方法

认识一个类一般都要从类的构造方法开始 

构造方法有三种:1、无参构造;2、利用其他collection构建ArrayList;3、指定顺序表初始容量

以无参构造为例:

ArrayList中的方法(对部分方法进行解析)

 Add方法

“先检测是否有可供插入的空间,然后将目前数组末尾的下一位下标的值设定为参数”

那么它是怎样检验是否可以插入的?

Add()中的ensureCapacityInternal

 ensureCapacityInternal()方法是为了确保 拿到的的数组容量满足使用。

我们通过源码了解到,ensureCapacityInternal中又有两个方法:ensureExplicitCapacity、calculateCapacity

先来看calculateCapacity

calculateCapacity()方法

如果ArrayList的底层数组elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA(通过查看源码中的成员属性可以得知这是一个空数组)时,返回10(通过查看源码得知:当向起始的空数组中插入元素时,会给这个空数组赋予10个容量)和minCapacity(参数)的最大值,否则返回minCapacity的值(minCapacity被视为数组容量) 

这个方法为了得知 需要的数组容量。

ensureExplicitCapacity()方法

如果当前需要的数组容量 比目前的数组长度大的话,需要进行扩容

这个方法是为了获得 符合要求的数组容量

grow()扩容方法

 定义原来的数组长度为旧容量,将旧容量扩容1.5倍后于所需容量minCapacity比较,如果新容量小于mC,就将mC设置为新容量;如果新容量大于数组最大长度(MAX_ARRAY_SIZE)(这是一个常量),就进行一次判断(使用hugeCapacity方法判断):如果需求容量小于0,抛出异常;如果需求容量比数组最大长度还要大,就将新容量定义为Integer的最大值,否则就将新容量定义为数组最大长度

注:MAX_ARRAY_SIZE与MAX_VALUE

为什么会有MAX_ARRAY_SIZE的定义呢?

 因为数组有点特殊性,数组对象要额外存储 数组元素长度 在头部,少了这8个长度可能与此有关。 尝试分配大于 MAX_ARRAY_SIZE 长度的数组会导致 OOM (换句话说,超过了该虚拟机的数组长度限制)。

如果MAX_ARRAY_SIZE的长度还不够用,就直接将Integer的最大值给新数组(数组长度是个Integer类型-是一个整数)。至于会不会因为OOM报错那就不管了

remove()方法

当我们使用remove方法时,会将我们传入的参数识别为一个下标,而不是我们所想的“一个对象”(例如“ArrayList.remove(0)” 删除0下标/删除数字0——“arraylist.remove(new Interger(0))”)——这是因为有两个remove方法,可以传一个下标,也可以传一个对象

subList()方法

 从数组fromIndex下标开始,取出toIndex个元素放入subList数组中

如果改变sub(从list中)截取出来的数组中的数据,将会一起改变list中的数据

“sub”和“list”共用一个elementData数组 

遍历ArrayList的三种方法

相关文章:

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系 List List是一个接口,不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList站在数据结构的角度看,List就是一个线性表。常见的线性表:顺序表、链表、栈、队列等 线性表 线性表是n个具有相…...

智慧公厕设备选型攻略,打造智能化便利生活体验

智慧公厕设备的选型对于打造智能化便利生活体验起着至关重要的作用。在不断提升城市品质的背景下,智慧公厕已成为城市建设中的一项重要内容。在选购智慧公厕设备时,我们需要考虑到不同版本的功能要求,确保公厕设备的质量和性能。本文以智慧公…...

TCP 协议的可靠传输机制是怎样实现的?

TCP 协议是一种面向连接的、可靠的、基于字节流的传输层协议。 1 它通过以下几种方法来保证数据传输的可靠性: 检验和:TCP 在发送和接收数据时,都会计算一个检验和,用来检测数据是否在传输过程中发生了错误或损坏。如果检验和不匹…...

Antv G6入门之旅--combo图

目录 什么是AntV G6 G6 的特性 G6 文档 安装 1 在项目中使用 NPM 包引入 2 在 HTML 中使用 CDN 引入 使用 Step 1 创建容器 Step 2 数据准备 Step 3 创建关系图 Step 4 配置数据源,渲染 React 中使用 G6 Combo图 什么是AntV G6 G6 是一个图可视化引擎…...

聊聊分布式架构09——分布式中的一致性协议

目录 01从集中式到分布式 系统特点 集中式特点 分布式特点 事务处理差异 02一致性协议与Paxos算法 2PC(Two-Phase Commit) 阶段一:提交事务请求 阶段二:执行事务提交 优缺点 3PC(Three-Phase Commit&#x…...

探索流视频的发送

1.网络连接 2.主设备将某处视频开始的视频数据发送给从设备。 之前有读取本地视频并播放的demo,所以可以先测试网络连接的问题。 先用模拟器进行模拟吧。方便进行测试。 是的,可以使用Android设备使用上述库或框架来构建实时Web应用程序。虽然这些库和框架在Java服…...

[ACTF2020 新生赛]Include 1

题目环境:超链接,点进去看看你能找到flag吗?除了这些网页什么都没有,但是不当紧,因为我们有一双善于发现的眼睛👀F12瞅瞅无,并无其他等等URL看了吗?发现存在一个参数file&#xff0c…...

教师必备宝藏,强烈推荐

亲爱的教师朋友们,你们是不是在为学期末成绩查询而头疼呢?一学期下来,成堆的试卷和成绩单,还有学生家长的各种咨询,让人应接不暇。现在,我给你们分享一个教师必备的宝藏,让你们的成绩查询工作变…...

「北大社送书」学习MATLAB—从算法到实战

MATLAB科学计算从入门到精通 一句话推荐书籍特色内容简介书籍概览 从代码到函数,从算法到实战,从问题到应用,由浅入深掌握科学计算方法,高效解决实际问题。 一句话推荐 科学计算基础入门,高效解决实际问题。 书籍特色…...

clion安装C++远程linux开发并调试 从装centos虚拟机到完美开发调试

下载镜像 阿里云镜像 从vmware上安装虚拟机并提权开放ssh 更新编译环境 一般 gcc gdb 版本都是比较低的,适配不了clion的最低要求。 升级gdb参考博客 升级gcc参考博客 安装CMAKE 官方的源使用wget即可下载 未找到openssl的解决办法 注意版本,又踩个…...

Android笔记

目录 触摸事件java弱引用WorkerThread注解NonNull注解camera.setFrameProcessingFormat(ImageFormat.YUV_420_888);YUV_420_888的字节数据长啥样YUV_420_888的字节数组长啥样 触摸事件 java弱引用 创建对象的弱引用,在没有强引用指向改对象的情况下,垃圾…...

Java虚拟机内存区域、异常、垃圾收集器

java虚拟机 java内存区域 jvm的主要组成部分及作用 主要包含两个子系统和两个组件 子系统 类加载器(Class loader):根据给定的类路径来装载class文件到运行时数据区 …...

深入理解JVM虚拟机第十三篇:详解JVM中的程序计数器

文章目录 一:程序计数器 1:概念 2:官方说法 3:图解 4:特点...

《合成孔径雷达成像算法与实现》Figure5.5

clc clear close all%% 参数设置 Ta 64; % 脉冲持续时间 Ka -1.56e-2; % 方位向调频率 Delta_f_dop abs(Ta*Ka); …...

leetcode经典面试150题---2.移除元素

题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…...

【尘缘赠书活动:01期】Python数据挖掘——入门进阶与实用案例分析

引言 本案例将根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功率等情况,分析各电力设备的实际用电量,进而为电力公司制定电能能源策略提供一定的参考依据。更多详细内容请参考**《Python数据挖掘:入门进阶与实用案例…...

计算机网络(谢希仁)第八版课后题答案(第二章)

1.物理层要解决哪些问题?物理层的主要特点是什么? (1)物理层要尽可能地屏蔽掉物理设备和传输媒体,通信手段的不同,使数据链路层感觉不到这些差异,只考虑完成本层的协议和服务。 (2)给其服务用户(数据链路…...

搭建nuxt3项目(框架构建)

需求 目标:我想搭建一个nuxt3的框架,实现一些基本的组件和路由、页面,方便后续遇到相关ssr项目直接复用。 同时:记录关于nuxt3的使用介绍关于Nuxt(详解以及周边) Nuxt 框架 1、一种基于 Node.js 的服务端…...

系统架构设计之微内核架构(Microkernel Architecture)

微内核架构(Microkernel Architecture) 一. 什么是微内核架构二. 微内核架构风格-拓扑结构三. 微内核的核心系统设计的三个关键点3.1 插件管理3.2 插件连接3.3 插件通信 四. 微内核架构的优缺点 一. 什么是微内核架构 微内核架构是一种面向功能进行拆分的…...

51单片机实现换能器超声波测水深

一,超声波换能器定义: 定义1:可把电能、机械能或声能从一种形式转换为另一种形式的能的装置。 所属学科:测绘学下的测绘仪器。 定义2:能量转换的器件。在水声领域中常把声呐换能器、水声换能器、电声换能器统称换能器。…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...