You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java LinkedList中size、first、last变量为何被定义为transient?

Java LinkedList中size、first、last标记为transient的原因

先看LinkedList中的这段核心代码:

transient int size = 0;

/**
 * 指向第一个节点的指针。
 * 不变式:(first == null && last == null) ||
 *            (first.prev == null && first.item != null)
 */
transient Node<E> first;

/**
 * 指向最后一个节点的指针。
 * 不变式:(first == null && last == null) ||
 *            (last.next == null && last.item != null)
 */
transient Node<E> last;

这三个变量被标记为transient,核心原因是LinkedList自定义了序列化逻辑,没有依赖默认的序列化机制:

  • size变量:序列化时完全没必要保存这个数值,反序列化时只要遍历一遍重建后的链表节点,就能重新算出元素总数,直接序列化size纯粹是浪费空间。
  • first和last指针:这俩只是链表的头尾引用,序列化的核心需求是保存链表中的元素内容,而非链表的结构指针。反序列化时,我们可以通过逐个读取元素、构建新的Node节点,最后再重新设置first和last的指向。要是直接序列化这两个指针,不仅会带来额外的冗余数据,还可能因为Node节点内部的prev/next引用引发循环序列化的问题。

简单来说,LinkedList自己实现了writeObject和readObject方法,序列化时只遍历保存每个元素,反序列化时再重新构建整个链表结构,所以这三个变量完全不需要跟着默认序列化流程走,用transient标记跳过即可。

内容的提问来源于stack exchange,提问作者xiunian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:40:16