- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LinkedList 源码分析研究.doc
LinkedList源码简单分析
LinkedList的声明
public class LinkedListE
extends AbstractSequentialListE
implements ListE, DequeE/*这是双端队列接口,这个接口扩展了Queue接口,提供了更多的方法,比如push,pop等*/, Cloneable, java.io.Serializable
所以LinkedList可以被用作Stack,Queue和Deque
来看一下链表结点的 定义
private static class EntryE {
E element;
EntryE next;
EntryE previous; //由此可以看出LinkedList是一个双向链表
Entry(E element, EntryE next, EntryE previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
LinkedList中声明了下面两个实例变量:
//头结点,起标记作用,并不记录元素
private transient EntryE header = new EntryE(null, null, null);
//链表的大小 ,即链表中元素的个数
private transient int size = 0;
我们可以看到这两个 就是都被声明成了transient,所以在序列化的过程中会忽略它们,但是LinkedList提供的序列化方法writeObject(java.io.ObjectOutputStream s)中却序列化了size,并且将除header之外的所有结点都 写到序列化文件中了,那为什么要把size声明成transient呢,不解。。求解释。。
几个重要的方法:
/**
* Returns the indexed entry.
根据给定的索引值离表头近还是离表尾近决定从头还是从尾开始遍历
*/
private EntryE entry(int index) {
if (index 0 || index = size)
throw new IndexOutOfBoundsException(Index: +index+
, Size: +size);
EntryE e = header;
if (index (size 1)) { //如果较靠近有表头
for (int i = 0; i = index; i++)
e = e.next;
} else { //较靠近表尾
for (int i = size; i index; i--)
e = e.previous;
}
return e;
}
/**
*将元素e添加到entry结点之前
*/
private EntryE addBefore(E e, EntryE entry) {
EntryE newEntry = new EntryE(e, entry, entry.previous);
newEntry.previous.next = newEntry; //将新结点与前后结点相连接
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
/**
*删除给定的结点e
*/
private E remove(EntryE e) {
if (e == header)
throw new NoSuchElementException();
E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}
/**
*从表头开始遍历,返回此元素在表中的第一个位置
文档评论(0)