LinkedList 中的序列化是如何工作的?
How serialization work in LinkedList?
我不明白 LinkedList 如何理解反序列化后第一个和最后一个元素的位置。
因为字段有如下结构
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
谁能帮忙看懂?
LinkedList
method readObject
决定了 first
和 last
在列表重建过程中指的是什么。这是来自 link:
的代码
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in any hidden serialization magic
s.defaultReadObject();
// Read in size
int size = s.readInt();
// Read in all elements in the proper order.
for (int i = 0; i < size; i++)
linkLast((E)s.readObject());
}
linkLast
方法跟踪 first
和 last
。它在第一个要重建的节点上初始化 first
和 last
,并用每个新重建的节点更新 last
。
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
我不明白 LinkedList 如何理解反序列化后第一个和最后一个元素的位置。 因为字段有如下结构
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
谁能帮忙看懂?
LinkedList
method readObject
决定了 first
和 last
在列表重建过程中指的是什么。这是来自 link:
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in any hidden serialization magic
s.defaultReadObject();
// Read in size
int size = s.readInt();
// Read in all elements in the proper order.
for (int i = 0; i < size; i++)
linkLast((E)s.readObject());
}
linkLast
方法跟踪 first
和 last
。它在第一个要重建的节点上初始化 first
和 last
,并用每个新重建的节点更新 last
。
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}