首页 > 其他分享 >ArrayList底层原理

ArrayList底层原理

时间:2024-03-06 17:33:53浏览次数:25  
标签:ArrayList 元素 transient 数组 原理 序列化 底层

JDK版本11

ArrayList类声明


其中RandomAccess、Cloneable、Serializable都是标记接口,用来表示ArrayList支持随机读取、克隆和序列化反序列化。

ArrayList集合添加元素底层原理

  1. 利用空参创建集合,在底层创建一个默认长度为0的数组。
  2. 添加第一个元素时,底层会创建一个新的长度为10的数组(elementData)。
  3. 存满时,会扩容1.5倍,然后将元素拷贝到新数组中。
  4. 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准。

空参初始化

ArrayList无参构造会创建一个默认长度为0的数组。



transient修饰的底层数组

transient Object[] elementData;

transient修饰的变量不会参与序列化和反序列化的过程。

写到这里有一个疑问,既然底层的数组不会被序列化那么对象传输、或者持久化时候数据是怎么保存的?

我注意到了两个方法,真相大白了。原来是ArrayList自己实现了底层数组的
序列化

和反序列化,

这两个自己实现的序列化并不是没有序列化,而是仅仅对有效的数据进行了序列化。
这样有什么好处呢?
我们知道ArrayList的底层数组是会扩容的,但是不会缩容,并且ArrayList可以删除元素。
想象下面场景,我有一个ArrayList对象存储了100万条数据,但是因为后续操作,我删除的只剩下了一条数据,如果底层数组不被transient修饰,那么这999999条空数据都会被序列化进行数据持久化或者网络传输,这样是十分浪费资源的,但是ArrayList自己实现的序列化只用序列化一条有效的数据进行传输,这样效率就会十分高。

初始化ArrayList并添加一个元素的运行过程

标签:ArrayList,元素,transient,数组,原理,序列化,底层
From: https://www.cnblogs.com/poteitoutou/p/18056424

相关文章

  • React jsx 语法解析 & 转换原理
    jsx介绍jsx是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScriptXML,因为看起就是一段XML语法,用于描述UI界面,并且可以和JavaScript代码结合使用。比起vue中的模板语法,更加灵活,且不需要学习模板语法中的特定标签,比如:v-if、v-for、v-bind等,而是直接使用JavaScript语......
  • 面试官:说说微服务灰度发布的底层实现?
    微服务中的灰度发布(又称为金丝雀发布)是一种持续部署策略,它允许在正式环境的小部分用户群体上先部署新版本的应用程序或服务,而不是一次性对所有用户同时发布全新的版本。这种方式有助于在生产环境中逐步验证新版本的稳定性和兼容性,同时最小化潜在风险,不影响大部分用户的正常使用......
  • 河北稳控科技岩土工程安全监测仪器振弦采集仪的原理与应用
    岩土工程安全监测仪器振弦采集仪的原理与应用岩土工程安全监测仪器振弦采集仪是一种用于测量土地和岩石的动力特性的仪器。其原理是利用振动传播在土壤和岩石中的速度来推断地下结构物的品质,如土质的密度、弹性模量、泊松比等。河北稳控科技振弦采集仪的工作原理基于谐波振动的......
  • JVM原理
    一、概念JVM是Java-Virtual-Machine的缩写,即Java虚拟机。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。首先一次编译处处运行是学习Java语言都知道的事情,其实并不是Java语言跨平台,是JVM跨平台,Jvm运行时并不是执......
  • CopyOnWriteArrayList
    CopyOnWriteArrayList目录CopyOnWriteArrayListCopyOnWriteArrayList诞生记CopyOnWriteArrayList使用场景CopyOnWriteArrayList读写操作实现原理缺点源码分析CopyOnWriteArrayList诞生记代替Vector和SynchronizedList,就像ConcurrentHashMap代替SynchronizedMap的原因一样Vect......
  • 消息中间件RabbitMQ的原理和使用
    一、什么是MQMQ是MessageQueue的简写,表示消息队列的意思,它是一种用于在应用程序之间传递消息的技术。多用于分布式系统之间进行通信,作为消息中间件使用。MQ的作用有应用解耦、异步提速、流量削峰填谷,当然也有缺点,加入MQ消息中间件会额外增加系统的外部依赖,是系统稳定性降低,同......
  • MyBatis 底层工作原理
    引言SqlSession是MyBatis提供的面向用户的操作数据库API。那么MyBatis底层是如何工作的呢?为了解开MyBatis的神秘面纱,我们需要了解一下MyBatis的其他几个比较核心的组件及这些组件的作用。MyBatis核心组件MyBatis的执行流程及核心组件如图:Configuration:用于描述MyBati......
  • 前端 vite 的原理
    很多前端框VUEReact都是使用webpack打包为何使用vitewebpack打包很慢,热更不友好一个模块的变化导致整个项目的重新编译vite真正的按需加载:利用浏览器ESM支持,实现真正的按需加载原理由于ES6的在浏览器的支持ESM可以只实现在浏览器直接使用import发送http请求......
  • 面试官:说说SpringAOP实现原理?
    AOP(Aspect-OrientedProgramming,面向切面编程)是一种编程技术,它允许开发者在不改变现有代码的情况下,增加新的功能或行为,这些功能或行为被称为“切面”。AOP可以通过预编译方式和运行期动态代理的方式来实现,它的主要目的是降低业务逻辑的耦合性,提高程序的可重用性和开发效率。AOP......
  • git原理性概念
    参考资料近期学习git内部概念及原理,为了加强效果和日后回忆,还是写了这篇笔记进行输出。参考资料如下:这才是真正的Git——Git内部原理-LZANE|李泽帆(靓仔)《VersionControlwithgit》实验环境:unbuntu18objects(blobstreecommitstag)&hashgit里的object有四种:tree......