🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
LinkedList 源码分析(五)总结🤞这次都给他拿下🤞
正菜来了⛳⛳⛳
🎈LinkedList 源码中的函数
🍮private static class Node<E> {}
含义:这个静态内部类 Node 表示的是表示的是 List 中节点,因为 LinkedList 是一个链表的形式,所以存储的是一个链表的结构,即每一个节点除了存储对应的元素值之外还要存储前置节点和后置接点的引用。
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
复制代码
🍮Object clone()
含义:返回一个克隆的对象,但是这个拷贝是一个浅拷贝的,元素本身是没有被重新创建的,也就是 Node 中的 item 可能是一个引用,但是 clone 出来的两个对象中的 item 是不变的,从下边的 clone.add(x.item);语句中可以看出 clone 的时候只是创建一个新的 list,并且把现有的 list 中的元素添加到新创建的 list 中。
public Object clone() {
LinkedList<E> clone = superClone();
// Put clone into "virgin" state
clone.first = clone.last = null;
clone.size = 0;
clone.modCount = 0;
// Initialize clone with our elements
for (Node<E> x = first; x != null; x = x.next)
clone.add(x.item);
return clone;
}
复制代码
🍮public Object[] toArray()
含义:toArray 这个函数就是把列表中的所有元素方法一个数组中,并返回,相当于把链表数组化了。
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
return result;
}
复制代码
🍮writeObject(java.io.ObjectOutputStream s)
含义:见名知意,这个函数的意思是把 LinkedList 中的每个元素序列化为数据流到 s 中去,从下边的函数中可以看出总共有两个类型,一个是写的 LinkedList 的 size 即 LinkedList 的元素数量,另一个是把所有元素写道流中。
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
// Write out any hidden serialization magic
s.defaultWriteObject();
// Write out size
s.writeInt(size);
// Write out all elements in the proper order.
for (Node<E> x = first; x != null; x = x.next)
s.writeObject(x.item);
}
复制代码
🍮readObject(java.io.ObjectOutputStream s)
含义:这个函数的意思和上边的 writeObject 是相反的,上边的函数是序列化,下边的函数是反序列化,即把 s 流中的字节流反序列化为 LinkedList 中的元素。
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());
}
复制代码
🍚总结
以上是是关于 LinkedList 源码分析的总结,希望有所帮助,下篇,开始读 Collection 中的 set 集合。
评论