ArrayList中为什么使用transient修饰elementData?

工商银行软件开发中心数据安全监测溯源防护体系建设成果及展望 结合业界先进溯源理念和我行管理要求,依托大数据、分布式搜索分析引擎等技术,构建PB级海量数据加工分析和小时级快速核验、检索、溯源手段(如图6所示),支撑6种客户敏感信息关键要素的单一或组合溯源,形成行之有效的数据安全溯源流程,配套落地自动化快速泄露样本真实性核验和灵活高效的溯源能力,通过数据相关属性的自动化分析,实现追踪泄露源头、明确泄露路径的目标,为有效应对数据安全事件,降低和消除风险与不良影响,开展事后追责处置工作提供体系化解决方案。提高数据排查的自动化程度和排查效率,降低人工成本。 阅读详情

为什么使用transient修饰elementData?

既然要将ArrayList的字段序列化(即将elementData序列化),那为什么又要用transient修饰elementData呢?

回想ArrayList的自动扩容机制,elementData数组相当于容器,当容器不足时就会再扩充容量,但是容器的容量往往都是大于或者等于ArrayList所存元素的个数。

比如,现在实际有了8个元素,那么elementData数组的容量可能是8x1.5=12,如果直接序列化elementData数组,那么就会浪费4个元素的空间,特别是当元素个数非常多时,这种浪费是非常不合算的。

所以ArrayList的设计者将elementData设计为transient,然后在writeObject方法中手动将其序列化,并且只序列化了实际存储的那些元素,而不是整个数组。

见源码:

// Write out all elements in the proper order.
for (int i=0; i<size; i++)
{
    s.writeObject(elementData[i]);
}
从源码中,可以观察到 循环时是使用i<size而不是 i<elementData.length,说明序列化时,只需实际存储的那些元素,而不是整个数组。
汉书HE8,好用的汇编代码编写工具 汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大 立即下载

相关推荐

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 427

ArrayList 的数组为什么修饰成tansient

ArrayList 的数组为什么修饰成tansient ArrayList底层是基于动态数组实现的,数组的长度是动态变化的,初始化长度为0,当添加一个元素的时候,数组的长度就会发生变化(不得不说,开发人员对内存优化的很到位)。可以看到elementData数组是transient修饰的,而被transient` 修饰的变量不会被序列化。 而对象的序列化和反序列化是通过调用方法 writeObject() 和 readObject() 完成,我们发现,ArrayList 自己实现这两个方法 假如element

qq_35274666的博客 633

学术类PPT制作总结

本文分享了科技类PPT的制作技巧,希望相关的信息能帮助到读者。

奇妙水果的技术博客,欢迎交流技术~ 2885

CCleaner清理C盘会捆绑软件吗?官方版与便携版避坑指南

系统清理工具是解决C盘空间不足与电脑卡顿的常用手段,但免费工具常通过安装向导夹带第三方推广,默认勾选让用户误以为是捆绑软件。CCleaner作为老牌清理工具,官方版本身不携带恶意代码,真正风险多来自第三方下载站的绿色版。理解免费软件商业模式后,应优先选择官方便携版或在自定义安装中取消所有推广项。清理临时文件、浏览器缓存、回收站等垃圾时可配合系统还原点,防止误删。结合数字签名校验与定期清理节奏,即可既获得深度清理效果,又避开捆绑软件困扰。

weixin_33924220的博客 1017

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 553

北京联通IPTV组播实战:OpenWRT软路由配置全解析

本文详细解析了在北京联通IPTV环境下,利用OpenWRT软路由和udpxy工具实现组播转单播的实战配置。内容涵盖网络接口设置、防火墙规则、udpxy安装配置、直播源M3U文件处理以及全平台播放指南,帮助用户无需机顶盒即可在家庭局域网内任何设备上流畅观看电视直播。

weixin_29313547的博客 1416

arraylist属性中的elementdata关键字被transient修饰了,是为什么?

当 ArrayList 被序列化时,如果直接序列化 elementData 数组,那么无论数组中有多少元素被实际使用,整个数组都会被序列化。由于 ArrayList 需要以特定的方式序列化其元素(只序列化实际存储的元素),因此它实现了 writeObject 和 readObject 方法来执行自定义的序列化和反序列化操作。ArrayList 的内部实现可能会根据需要进行调整,例如当添加元素导致数组容量不足时,会创建一个新的、更大的数组,并将原数组中的元素复制到新数组中。

DKPT的博客 927

Hi3516CV610开发板实战:从零搭建智能视觉监控系统

本文详细介绍了从零开始基于Hi3516CV610开发板搭建智能视觉监控系统的完整实战流程。涵盖硬件连接、系统配置、摄像头集成、网络设置、固件烧录到视频处理与智能分析功能开发,提供了丰富的实践经验和调试技巧,帮助开发者快速掌握嵌入式视觉系统开发。

vvv99的博客 565

ArrayList的elementData为什么要修饰为transient?

ArrayList源码: private transient Object[] elementData; 为什么要将elementData修饰为transient呢? 比较靠谱的说法: elementData数组相当于容器,当容器不足时就会再扩充容量,但是容器的容量往往都是大于或者等于ArrayList所存元素的个数。 比如,现在实际有了8个元素,那么elementData数组的

qingmengwuhen1的博客 1540

Qwen3.6-27B本地部署实战:LM Studio配置、硬件门槛与避坑指南

大语言模型本地部署是当前AI工程落地的核心能力之一,其本质是将高参数量模型(如27B级)在受限硬件环境下实现低延迟、高稳定推理。关键技术原理涵盖量化压缩(如GGUF格式与q4_k_m精度权衡)、GPU显存分配策略(KV Cache管理与Offloading机制)、以及运行时环境兼容性(CUDA驱动、llama.cpp后端版本)。该能力直接决定私有化AI应用的技术可行性与成本边界,广泛应用于企业知识库构建、代码辅助、长文档分析等对数据主权和响应确定性要求高的场景。本文聚焦Qwen3.6-27B这一典型27B模

weixin_33272631的博客 468

手机银行应用架构设计

网上银行借助互联网、移动通信网络等技术向客户提供金融服务,易受到通讯层面的安全威胁,金融机构应从通讯协议、安全认证、通信链路安全等层面,采取措施有效应对相关风险。网上银行系统服务器端提供网上银行应用服务和核心业务处理功能,金融机构应充分利用物理环境、通信网络、计算环境等领域的防护技术,在攻击者和受保护的资源间建立多道严密的安全防线。 网上银行除直接向用户提供金融服务外,也可能与外部机构开展业务合作。在网上银行系统设计、开发、部署和运营过程中,应充分考虑外部机构的系统可能存在的安全风险,并针对各类风险进行有效

银行信息系统应用架构详解 4836

ArrayList中elementData为什么被transient修饰?

Java的ArrayList中,定义了一个数组elementData用来装载对象的,具体定义如下: transient Object[] elementData; transient用来表示一个域不是该对象序行化的一部分,当一个对象被序行化的时候,transient修饰的变量的值是不包括在序行化的表示中的。但是ArrayList又是可序行化的类,elementData是ArrayList具体存放元素的成员,用transient来修饰elementData,岂不是反序列化后的ArrayList丢失了原先的

hhc9_9的博客 538

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ArrayList 的 elementData 加上 transient 修饰

由于字段被标记为transientArrayList需要实现自定义的序列化和反序列化逻辑,以确保实际元素能够正确保存和恢复。这是通过实现和readObject方法来完成的。ArrayList的字段使用transient修饰符来防止它在序列化过程中被直接写入输出流。这一设计决定是出于性能和内存效率的考虑,通过自定义序列化和反序列化方法,ArrayList能够仅序列化实际存储的元素,并在反序列化时恢复正确的数据结构,而不会浪费空间或导致不必要的内存使用。这种做法确保了ArrayList。

Flying_Fish_roe的博客 1037

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ArrayList中elementData为什么被transient修饰

https://blog.youkuaiyun.com/zero__007/article/details/52166306 Java的ArrayList中,定义了一个数组elementData用来装载对象的,具体定义如下: /** * The array buffer into which the elements of the ArrayList are stored. * The capacity ...

编程之美 1468

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java elementdata_ArrayList中elementData为什么被transient修饰

Java的ArrayList中,定义了一个数组elementData用来装载对象的,具体定义如下:/*** The array buffer into which the elements of the ArrayList are stored.* The capacity of the ArrayList is the length of this array buffer. Any* empt...

weixin_35911307的博客 291

Java - ArrayList 中 elementData 为什么被 transient 修饰?

Java - ArrayList 中 elementData 为什么被 transient 修饰?

990

ArrayList的elementData为什么要用transient修饰

transient干嘛用的? 当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。例如,当反序列化对象——数据流(例如,文件)可能不存在时,原因是你的对象中存在类型为java.io.InputStream的变量,序列化时这些变量引用的输入流无法被打开。

weixin_32798865的博客 1753

为什么 ArrayList 的 elementData 加上 transient修饰?

ArrayList通过将elementData数组标记为transient实现精准序列化控制,仅存储实际元素而非整个数组空间。这种设计解决了默认序列化会保存空值导致空间浪费的问题,通过重写writeObject方法实现"按需打包":先记录数组容量,再仅序列化有效元素(循环到size而非length)。相比默认方式,该方案显著减小文件大小、提升传输速度,同时通过modCount检查确保线程安全。这种优化思路适用于任何需要高效处理稀疏数据或动态容器的场景,体现了空间与性能的平衡智慧。

weixin_46028606的博客 760

Arraylist的elementData修饰关键词transient到底要闹哪样

Java代码   private transient E[] elementData;    声明为transient,为什么还可以序列化成功呢? 我的回答是ArrayList重写了 Java代码   private void writeObject(java.io.ObjectOutputStream s)          throws java.io.I

杂记 700

java elementdata_序列化与ArrayList 的elementData的修饰关键字transient

transient用来表示一个域不是该对象序行化的一部分,当一个对象被序行化的时候,transient修饰的变量不会被序列化ArrayList的动态数组elementData被transient 修饰的 那么岂不是反序列化后的ArrayList丢失了原先的元素, 其实不然.ArrayList在序列化的时候会调用writeObject,反序列化时调用readObject 也就是自定义序列化为...

weixin_39652869的博客 195
上一篇: tomcat server.xml配置黑名单
下一篇: java访问修饰符概述
LQW_home
博客等级 码龄12年 66粉丝 232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值