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

news2024/10/2 16:30:01

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的三种方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决SpringBoot整合Activiti引用JPA:缺少javax.persistence.EntityManagerFactory

系统接入工作流Activiti的时候,发现activiti初始化表,操作数据库使用的是jpa,我们这里解决办法就是引入spring-data-jpa-starter自动配置EntityManagerFactory。 首先把工作流sql文件执行 基础依赖jar引入 这里忽略Activiti的基础依赖,以下…

什么是云原生?土生土长?

“云原生”(Cloud Native)是一种构建和运行应用程序的方法,这种方法充分利用了云计算的优势。云原生应用程序是为云环境设计的,通常是在容器中运行,并被设计为在微服务架构中运行,这使得它们能够快速扩展和…

进公司第二天:绿盾+TFS拉取代码

1.配置绿盾 绿盾:一种安全软件 遇到的问题 TFS端口号:192.168.3.231 服务端口号:默认(千万别瞎写啥的) 2.配置TFS拉取代码 TFS利用插件 ,输入公司给你的信息你的各种信息 拉取代码就行。 3.查看代码 —…

系统架构师备考倒计时12天(每日知识点)

1. 基于架构的软件设计(ABSD) (ABSD方法是架构驱动,即强调由业务【商业】、质量和功能需求的组合驱动架构设计。ABSD方法有三个基础。第一个基础是功能的分解。在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术;第二个基…

上位机通过Modbus转Profinet网关与变频器Modbus通讯配置案例

上位机与变频器Modbus通讯是通过Modbus转Profinet网关来实现的。这个网关可以理解为一个通信翻译器,负责将上位机通过Modbus协议发送的数据转换为Profinet协议,再通过Profinet网络与变频器进行通信。 上位机通过Modbus转Profinet网关与变频器Modbus通讯&…

一些基本图像预处理---将一个文件中的所有图片进行尺度归一化、查看每个像素的RGB值,将指定颜色切换为白色、将文件中所有图片从png到jpg的切换

目录 1.将一个文件中的所有图片进行尺度归一化 2. 查看一张图片的每个像素的RGB值 3.将指定颜色切换成其他颜色(代码中将红色切换为白色) 4.将一个文件中所有图片从png到jpg的切换 5.将一个文件夹中的所有图像重命名从1开始 1.将一个文件中的所有图…

java--switch语句

1.switch语句 是通过比较值来决定执行那条分支。 2.switch分支的执行流程 ①先执行表达式的值,再拿着这个值去与case后的值进行匹配。 ②与那个case后的值匹配为true就执行那个case块的代码,遇到break就跳出switch分支。 ③如果全部case后的值与之匹…

睿趣科技:抖音小店申请流程

随着移动互联网的发展,越来越多的人开始尝试通过开设网店来创业。抖音作为国内最受欢迎的短视频平台之一,也推出了自己的电商功能——抖音小店。那么,如何申请抖音小店呢?下面就为大家详细介绍一下抖音小店的申请流程。 首先,打开…

powerdesigner下载安装教程

1、什么是PowerDesigner PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型(ConceptualDataModel)、…

从语言层面了解线程(std::thread)使用的里里外外

从语言层面了解线程(std::thread)使用的里里外外 使用 C标准库提供的 std::thread,配合 std::mutex、std::condition_variable 等工具可以很方便地编写并发程序。C标准库针对不同的操作系统中并发编程相关的系统调用做了很好的封装,提供了非常简洁易用的…

html iframe 框架有哪些优缺点?

目录 前言: 用法: 理解: 优点: 嵌套外部内容: 独立性: 分离安全性: 跨平台兼容性: 方便维护: 缺点: 性能开销: 用户体验问题&#xf…

智慧公厕:打造更美好的城市生活环境

在信息技术迅猛发展的今天,智慧公厕作为一种创新的城市管理模式,正逐渐受到人们的关注。以物联网、大数据、人工智能为基础,智慧公厕正逐步改变传统公厕的面貌,为城市居民提供更便捷、舒适的公共服务。本文将以智慧公厕源头厂家广…

登福布斯小企业推荐邮箱供应商榜单:高效沟通,轻松管理

近日,知名财经网站福布斯发布了一份针对小企业的推荐邮箱供应商名单 ,其中Zoho Mail企业邮箱凭借其卓越的产品特性和优质的客户服务成功上榜。 Zoho Mail企业邮箱是由印度科技公司Zoho Corporation研发的一款全功能电子邮件和协作平台,在中国…

C++基础语法——C++11

目录 1. 统一的列表初始化 ①{}进行初始化 ②std::initializer_list 1.类型 2.使用场景 2.声明 ①auto ②decltype ③nullptr 3.范围for 4.右值引用与移动语义 ①左值引用与右值引用 ②左值引用与右值引用的比较 ③左值引用与右值引用的使用场景与意义、移动语义…

Python算法练习 10.24

leetcode 199 二叉树的深度 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输…

统计学习方法 支持向量机(上)

文章目录 统计学习方法 支持向量机(上)线性可分支持向量机与硬间隔最大化定义硬间隔最大化对偶算法 线性支持向量机与软间隔最大化定义软间隔最大化对偶算法合页损失函数 统计学习方法 支持向量机(上) 读李航的《统计学习方法》中…

分区操作系统

简单介绍 什么是分区 首次提出于ARINC 653标准,它是航空领域的一个标准,定义了多分区操作系统的核心服务。 分区使得操作系统的各个功能模块(即每个分区)看起来好像都被分配了独立的处理器和外设,它们之间通过专线通…

NVIDIA TensorRT 简介及使用

NVIDIA TensorRT 简介及使用 1. NVIDIA TensorRT 的简介2. NVIDIA TensorRT 的优势2.1 推理速度提升 36 倍2.2 优化推理性能2.3 加速每一项工作负载2.4 使用 Triton 进行部署、运行和扩展 3. NVIDIA TensorRT 大型语言模型的推理4. NVIDIA TensorRT 的使用方法5. NVIDIA Tensor…

这是什么牛马机器视觉公司

这是什么牛马机器视觉公司,签订培训协议服务期,培训完三年内跑路直接赔两万。 我看到很多外包公司签订此类合同,当然也有培训机构也会玩此种协议。 对于我这种职场老手,我应该给大家分析下: 我们先看下什么是服务期…

电能计量与远程抄表的应用

摘要:结合当前电力企业实际的发展概况,可知电力活动开展中对于性能可靠的电能计量及远程抄表依赖程度高,需要注重它们实际应用范围的扩大,满足电力企业长期稳定发展的实际需求。基于此,本文将对电能计量与远程抄表应用…