ArrayList学习(源码解读笔记)

ArrayList 源码分析 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用。值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。这可以减少递增式再分配的数量。这里以 JDK1.8 为例,分析一下。中可以存储任何类型的对象,包括。 阅读详情

1.ArrayList:
简介: 底层由数组实现,是一个动态数组,可以自动扩容.
首先看一下继承实现关系:
在这里插入图片描述
可以看到继承了AbstractList,实现了List,RandomAccess,Cloneable,Serializable
逐一来说:
AbstractList: 首先可以看到是抽象类,但点进去看了之后会发现他只有一个抽象方法get():

在这里插入图片描述
这时我在想为什么只有get()用abstract修饰呢,于是看了下其他方法,发现一个事情,在AbstractList中,add,set等方法是直接抛异常的,表示有点看不懂.
在这里插入图片描述
于是我从网上查了一下UnsupportedOperationException异常,说是在执行Arrays.asList()会遇到;于是我点进去看了一下,
在这里插入图片描述
这下就很清晰了,他直接返回了一个new ArrayList<>(a);,但是这个arraylist是不是我们平时用的arrlist呢,大家接着点就会发现,其实并不是一个类,这个返回的ArrayList只是Arrays里的一个内部类而已
在这里插入图片描述
他也继承了AbstractList,但是并没有重写set等方法,因此他执行了父类的set方法,所以才会抛出异常.而我们平时使用的new ArrayList<>()是自己重写了set等方法的.并没有使用父类的方法
在这里插入图片描述

List:这个就不细说了,不过有一点疑问是AbstractList也实现了List,为何ArrayList还要再实现一边呢,看网上说法不一,留待以后研究吧.

RandomAccess: 点进去是空的… 表示有点懵,于是查了一下,它是一个标记接口,而LinkedList并没有实现该接口,在Collections下的binarySearch方法中有这样一行代码
在这里插入图片描述
在二分查找的时候判断是否是RandomAccess的实例,不同的判断执行不同的方法(其中: BINARYSEARCH_THRESHOLD Collections的一个常量(5000),它是二分查找的阀值。)

然后看看两个方法的区别:
在这里插入图片描述
可以看出来indexedBinarySearch是通过get()访问元素,而iteratorBinarySearch是通过listIterator访问元素的,而两者有什么区别我也不知道.可以看看原博主链接RandomAccess接口理解,先留个坑,等回头再往深研究一下.

Cloneable: 点进去也是空的,应该也是一个标记接口,而clone方法直接定义在Object类中,clone必须要实现该接口,否则会报错CloneNotSupportedException;(对于clone了解不多,回头学习完更新)
在这里插入图片描述
而arrayList中也重写了clone方法在这里插入图片描述

Serializable: 序列化,也是标记接口,
对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化。而创建的字节流是与平台无关的,在一个平台上序列化的对象可以在不同的平台上反序列化.

在这里插入图片描述
序列化id,
如果用户没有自己声明一个serialVersionUID,接口会默认生成一个serialVersionUID
However, it is stronglyrecommended that all serializable classes explicitly declareserialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpectedInvalidClassExceptions during deserialization.
但是强烈建议用户自定义一个serialVersionUID,因为默认的serialVersinUID对于class的细节非常敏感,反序列化时可能会导致InvalidClassException这个异常。

顺便提一下transient关键字,它仅适用于变量,不适用于方法和类。代表不需要将该变量序列化.

今天先写到这,等下次学习的时候继续更新.

ArrayList源码解读—Java8版本 ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素。 阅读详情

相关推荐

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

Java中List和ArrayList的区别

List是一个接口,而ArrayList是一个类。 public interface List&lt;E&gt; extends Collection&lt;E&gt; { int size(); boolean isEmpty(); boolean contains(Object o); Iterator&lt;E&gt; iterator(); Ob...

晚晴小筑 325

高通Sensor Tuning实战:手把手教你用Chromatix生成并打包bin文件(附避坑指南)

本文详细介绍了高通Sensor Tuning的全流程实战,从Chromatix配置到Bin文件加载验证。通过手把手教程,帮助开发者掌握Chromatix工具链的使用,避免常见配置错误,提升调试效率。特别针对kalama等新一代平台,提供经过验证的解决方案和避坑指南。

ios99的博客 483

ArrayList源码分析精简版

简述扩容机制 常用属性 默认容量大小:private static final int DEFAULT_CAPACITY = 10; 默认大小空实例的数组实例:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 保存ArrayList数据的数组:transient Object[] elementData;...

qq_24095055的博客 400

导数在工程与AI中的12个实战应用解析

导数作为数学中的基本概念,本质是描述变化率的工具,其核心价值在于将非线性问题局部线性化处理。从原理上看,通过极限过程捕捉函数瞬时变化特性,使工程师能精确控制系统动态行为,帮助科学家量化自然规律变化速率。在技术实现层面,现代符号计算(如Mathematica)、数值计算(如MATLAB)和自动微分(如PyTorch)工具链的发展,大幅提升了导数计算的效率与精度。典型应用场景涵盖机械控制(如ABS防抱死系统)、金融工程(如期权希腊值计算)、医疗影像(如Canny边缘检测)等领域。特别在机器学习中,反向传播算法依

weixin_35509395的博客 316

Android 性能之 Game Mode

本文的目的是介绍 AOSP Game Mode 功能。Game Mode 功能的核心是系统服务 GameManagerService,在本文中用 GMS 指代 GameManagerService。在 API 26 之后,应用开发者可以通过将应用的 category 属性设置为 "game",使系统(即 GMS)能够将该应用识别为 "游戏"。GMS 定义了 4 种 game mode,即 1|2|3|4|standard|performance|battery|custom;

专注于系统快稳省领域 3064

ArrayList源码学习

文章目录ArrayList简介ArrayList核心源码源码重点方法分析System.arraycopy()和Arrays.copyOf()方法ArrayList核心扩容技术ArrayList经典Demo ArrayList简介 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来...

qq_24095055的博客 1115

【雷达成像实战】RD、CS、RMA算法对比与Matlab实现:从信号处理到高清成像

本文深入对比了雷达成像中三种核心算法:经典的距离多普勒算法(RD)、基于稀疏重建的压缩感知算法(CS)以及高精度的快速多通道获取算法(RMA)。通过详细的Matlab实战代码,从原理拆解到实现步骤,分析了各自在计算效率、成像精度、数据需求和适用场景上的优劣,为工程选型与算法实践提供了清晰指南。

weixin_29095587的博客 447

Java入门系列:实例讲解ArrayList用法

1.ArrayList构造函数 ArrayList类支持3个构造方法。 Arraylist() 这个构造方法构造了一个空的链表。 ArrayList(Collection&lt;? extends E&gt; c) 这个构造方法构造了一个包含指定元素集合的链表,注意,这里的字符E是一个标记,用来表示集合中元素的类型。至于具体是什么类型,需要你在使用这个构造方法的时候来指定。 ArrayLi...

qq_39536158的博客 276

树莓派 Raspberry Pi 使用 YOLOv8 YOLOv10 YOLOv11进行目标检测及推理加速,Run YOLOv8 YOLOv10 YOLOv11 on Raspberry Pi

libcamera 是 linux 新增加用于访问 camera 的 API。树莓派参与了 libcamera 的开发,并且在新的摄像头软件中开始从依赖于固件的摄像头图像处理管道(Image processing pipeline, ISP)迁移到更加开放的 libcamera。当然这块用USB 摄像头应该也是可以的。

shiter编写程序的艺术 5568

大数据分析案例-基于随机森林算法构建二手房价格预测模型

通过应用随机森林算法,我们希望建立一个能够有效预测二手房价格的模型。这个模型可以基于各种因素,如区域位置、房屋属性、市场供需等,来预测未来某一时间点的房价。通过提高预测准确性,我们可以更好地把握房地产市场动态,为决策提供更有价值的参考。揭示影响二手房价格的因素及其影响方式:通过分析随机森林算法生成的模型,我们可以进一步了解哪些因素对二手房价格有重要影响,以及这些因素如何影响房价。这有助于我们深入理解房地产市场的运行规律,为制定更为有效的市场策略提供依据。

m0_64336780的博客 1万+

Java基础 - LinkedList,泛型(接口,通配符),增强for,静态导入,可变参数,集合嵌套

A:案例演示ArrayList存储字符串并遍历泛型版A:泛型方法概述把泛型定义在方法上B:定义格式public 返回类型 方法名(泛型类型 变量名)C:案例演示泛型方法的使用A:泛型接口概述把泛型定义在接口上B:定义格式public interface 接口名C:案例演示泛型接口的使用A:增强for概述简化数组和Collection集合的遍历B:格式:for(元素数据类型 变量 : 数组或者Collection集合) {使用变量即可,该变量就是元素。

2401_84049061的博客 652

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java集合讲解

List类 :元素按顺序存放,而且元素可以重复Set类 :元素不按照顺序存放,而且还不能重复,每个元素的数据存放的位置是由该元素的Hashcode唯一决定,所以在集合中的位置也是固定的Map类: 它通过==键 : 值(key : Value)==来存放数据,而且也是没有顺序的面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!

2401_84150102的博客 818

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ArrayList源码解读

ArrayList 即 List 的动态数组实现,底层实现机制就是动态数组,且支持动态扩容。

MagicianTech的博客 2019

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java1.8源码之ArrayList源码解读

一、ArrayList概述 1.1 ArrayList简介 ArrayList经常用,今天对它的源码探究一二。 一上来顶部有一大串注释,顶部注释参考了这篇博客内容如下: List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector类,除了此类是不同步的。) ...

技术探求 1万+

关于ArrayList源码的解读

本文深入解读了ArrayList中常用方法的底层实现原理。1) add方法通过ensureCapacityInternal确保容量(默认扩容1.5倍),使用数组拷贝实现动态扩容;2) 带索引的add方法先检查索引合法性,再通过System.arraycopy移动元素;3) addAll方法将集合转为数组后批量添加;4) set/get方法通过索引直接操作底层数组;5) contains基于indexOf实现

2401_88840386的博客 957

【JavaSE】List接口--深入源码解读ArrayList、Vector与LinkedList

本文介绍了List接口的常用方法,并通过 debug 的方式深入源码讲解了 ArrayList、Vector与LinkedList的底层原理与区别。比如:ArrayList、Vector的底层数组扩容原理、LinkedList的增添底层做了什么......

黄小黄的博客 2232

一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList

一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList 一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之LinkedList 一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashMap 一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashSet 一、ArrayList 源码

诗水人间 11万+

JDK17源码系列-ArrayList源码解读

JDK17源码系列-ArrayList源码解读

siyueguoji的博客 968

集合ArrayList源码解读

ArrayList是Java中基于数组实现的动态数组结构,与普通数组不同,其容量可根据元素的增减动态调整。通过源码分析,ArrayList的核心机制包括:1. 构造方法:无参构造时初始化一个空数组,首次添加元素时扩容至默认容量10;有参构造则根据指定容量初始化数组。2. 添加元素:通过add方法添加元素时,若当前数组容量不足,会调用grow方法扩容,新容量通常为原容量的1.5倍。3. 删除元素:删除操作通过System.arraycopy高效移动元素,并将最后一个元素置为null以帮助垃圾回收。4. 修改与

2401_86179035的博客 862

【源码 JDK 1.8】ArrayList的源码解读

【代码】【源码 JDK 1.8】ArrayList的源码解读。

Number_In的博客 916

JAVA-ArrayList源码解读

从这里可以看出ArrayList的底层数据结构是数组;

qq_48496989的博客 881

Java之ArrayList源码解读

ArrayList的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。ArrayList继承于,实现了ListCloneable这些接口。: 表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问。:这是一个标志接口,表明实现这个接口的List集合是支持的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。

qq_62592925的博客 1034
上一篇: 通过xml配置redis中的 jedispool(有密码)
下一篇: 根据用户角色显示对应的模块(通过security实现)
programmer_hard
博客等级 码龄8年 3粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值