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

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...