当前位置: 首页 > 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:能量转换的器件。在水声领域中常把声呐换能器、水声换能器、电声换能器统称换能器。…...

免费开源字体 Source Sans 3 完整配置使用教程

免费开源字体 Source Sans 3 完整配置使用教程 【免费下载链接】source-sans Sans serif font family for user interface environments 项目地址: https://gitcode.com/gh_mirrors/so/source-sans Source Sans 3 是由 Adobe 开发的开源无衬线字体家族,专为现…...

Wan2.2-T2V-A5B轻量级优势:普通显卡也能秒出视频

Wan2.2-T2V-A5B轻量级优势:普通显卡也能秒出视频 1. 为什么选择轻量级视频生成模型 在AI视频生成领域,大多数模型对硬件的要求高得令人望而却步。传统视频生成模型通常需要专业级显卡和大量显存,这让普通开发者和内容创作者难以接触这项技术…...

OpenClaw技能扩展实战:用Qwen3-32B镜像自动处理Markdown文档

OpenClaw技能扩展实战:用Qwen3-32B镜像自动处理Markdown文档 1. 为什么需要文档自动化处理 作为一个长期与Markdown文档打交道的技术写作者,我经常遇到这样的困扰:当积累了几百篇笔记后,突然发现文件命名不规范需要批量修改&…...

5分钟搞定!OpenCode+Qwen3-4B本地AI编程助手一键部署教程

5分钟搞定!OpenCodeQwen3-4B本地AI编程助手一键部署教程 1. 引言:为什么你需要一个本地AI编程助手? 想象一下这个场景:你正在开发一个核心功能模块,需要快速生成一段复杂的业务逻辑代码。你打开浏览器,准…...

Linux内核驱动开发入门:我是如何给一个虚拟CDC ACM设备写“Hello World”驱动的

Linux内核驱动开发入门:手把手实现虚拟CDC ACM设备驱动 第一次接触Linux内核驱动开发时,面对复杂的代码结构和晦涩的概念,我完全摸不着头脑。直到导师扔给我一个USB转串口设备:"试试看能不能让它在Linux上工作"。经过两…...

11款独特开源字体,让你的创意设计焕发生机

11款独特开源字体,让你的创意设计焕发生机 【免费下载链接】HoYo-Glyphs Constructed scripts by HoYoverse 米哈游的架空文字 项目地址: https://gitcode.com/gh_mirrors/ho/HoYo-Glyphs 在数字创作领域,字体是视觉表达的核心元素。然而&#xf…...

为什么你的ranges::filter_view在C++27中突然崩溃?——深度逆向Clang 18.1.8 ABI变更引发的迭代器失效链

第一章:C27范围库扩展演进与ABI稳定性危机C27正以前所未有的力度重构范围(Ranges)库,引入std::ranges::zip_view的标准化、std::ranges::cartesian_product视图、以及支持异构比较的std::ranges::sort重载。这些增强显著提升了表达…...

5分钟部署大麦抢票助手:告别手动刷票的智能解决方案

5分钟部署大麦抢票助手:告别手动刷票的智能解决方案 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在热门演唱会门票秒光的时代,手动刷新抢票已经成为历史。DamaiHelper大…...

【QuantDev必藏】:为什么92%的C++交易系统仍在用malloc——深度剖析jemalloc/tcmalloc/mimalloc在L3缓存穿透场景下的失效临界点

第一章:金融高频交易系统内存分配的底层挑战与现实困境在纳秒级竞争的金融高频交易(HFT)场景中,内存分配不再是语言运行时的“黑盒服务”,而是决定订单延迟、吞吐一致性与系统可预测性的关键路径。传统堆分配器&#x…...

intv_ai_mk11应用场景:金融从业者用其生成监管政策要点摘要、投研报告初稿框架

intv_ai_mk11在金融领域的应用实践:政策摘要与投研报告生成 1. 金融从业者的AI助手需求 金融行业每天需要处理海量的监管政策和市场信息,传统人工处理方式面临三大挑战: 时效性压力:新政策发布后需要快速理解要点信息过载&…...