当前位置: 首页 > news >正文

ArrayList 在序列化时的重写重写了 writeObject()特殊处理的原因

ArrayList 中,elementData 是用来存储元素的内部数组,但它往往比实际元素多。
为了避免序列化多余的 null 空位,JDK 把它标记为 transient,并通过重写 writeObject()/readObject() 方法,只序列化实际存在的元素,从而节省空间、提高效率。

一、什么是序列化(Serialization)

序列化是 Java 把对象转换成字节流,以便:

  • 写入磁盘(持久化存储);

  • 或通过网络传输。

反序列化(Deserialization)则是把字节流重新还原为对象。

要支持序列化,一个类必须实现 java.io.Serializable 接口。
例如:

class Person implements Serializable {String name;int age;
}

二、ArrayList 实现了 Serializable 接口

ArrayList 是可序列化的:

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

但它在序列化时没有直接序列化整个内部数组,而是只序列化其中实际存放的元素部分
这就是“自定义序列化逻辑”的由来。

三、为什么需要自定义序列化逻辑

ArrayList 底层是一个可变长数组:

transient Object[] elementData; // 存放元素的数组
private int size; // 实际元素个数

这里有两个关键点:

  1. elementData 是一个 比实际元素数量更大的数组(为了预留扩容空间)。

  2. 它被声明为 transient,即:

    transient Object[] elementData;
    
    transient的意思是:在默认序列化时不会被写入字节流中

四、为什么 elementData 要用 transient

如果不加 transient,Java 默认会序列化整个数组,包括:

  • 有效元素;

  • 多余的 null 空位。

举个例子:

ArrayList<String> list = new ArrayList<>(10);
list.add("A");
list.add("B");

此时:

  • size = 2

  • elementData.length = 10

若直接序列化整个 elementData,就会把 8 个无用的 null 一起写进文件,不仅浪费空间,还没意义。所以,JDK 设计者用了 transient,并重写了序列化方法,只序列化有效数据

五、ArrayList 的自定义序列化方法

ArrayList 重写了 writeObject()readObject() 方法,用来自定义序列化逻辑。
源码(简化版)如下:

private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {int expectedModCount = modCount;// 执行默认序列化(不包含 transient 字段)s.defaultWriteObject();// 写入实际元素个数s.writeInt(size);// 写入有效元素for (int i = 0; i < size; i++) {s.writeObject(elementData[i]);}if (modCount != expectedModCount) {throw new ConcurrentModificationException();}
}

http://www.dtcms.com/a/454483.html

相关文章:

  • 南山做网站推广乐云seo买一个普通商标多少钱
  • 江西新农村建设权威网站在那可以做公司网站
  • 购物网站的设计头像制作免费生成器
  • 怎么做ppt教程网站网页设计登录注册页面代码
  • 【51单片机】【protues仿真】基于51单片机贪吃蛇游戏系统
  • 昆明学校网站设计公司网页设计项目模板代码
  • 有没有做培养基的网站已备案网站想关闭
  • 【Canvas与旗帜】油管五常之印度旗恒河之眼版
  • 广州门户网站开发济南seo优化外包
  • 微网站样式wordpress 插件编写
  • Oracle数据库常见问题实战:从连接错误到自动清理空闲会话
  • 网站开发项目管理步骤如何做国外的网站
  • 建设银行潍坊支行网站wordpress博客二次元
  • html5网站开发特点wordpress导出导入
  • 个人博客网站总结全网营销解决方案
  • 域名注册好后怎么建设网站官网浏览器
  • Smac Planner与 NavFn Planner 的对比分析
  • 傅里叶变换·思考
  • 南部县网站建设怎样建单位的网站
  • 虹桥做网站WordPress的主题制作教程
  • 太仓高端网站制作甘肃省建设银行校园招聘网站
  • 人力资源网站建设方案安装wordpress中文包
  • 江苏省建设厅网站建造师强制注销有哪些网站的搜索引擎
  • wordpress 多语言网站网站配图尺寸
  • 站长工具在线免费观看网络营销推广网站
  • tdk标签影响网站权重广州现在算什么风险地区
  • AssemblyScript 入门教程(9):直接内存管理
  • 新的南宁网站建设公司WordPress中文空格
  • 手机网站设计小程序wordpress用什么系统
  • STIP开源股票技术指标回测分析平台产品深度分析