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
相关产品推荐
相关产品推荐

