标签:
之前写程序似乎也没有怎么关注过底层的结构,最近正好遇到了链表的问题,于是仔细阅读了Java中链表的实现LinkedList
简单记录一下看完的总结:
1.LinkedList中定义了一个类型Node<E> ,包括3个属性,即Node中封装的元素item,当前元素的前一个元素引用和后一个元素引用prev/next,和链表定义一直,没什么新鲜
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;
}
}
2.链表的特点是在首尾添加内容比较快捷,所以LinkedList除了实现List接口的add/remove外,还增加了在首尾增加元素的方法addFirst/addList ,removeFirst,removeLast,以及getFirst,getLast获取首尾元素的方法
3.List接口中得get/remove/add等操作实际上都是操作链表的最末尾
其中我一直想知道的是链表中对List接口中得get(index)方法是如何实现的,或者说现实容易,有什么优化呢,看了源代码,发现原来优化的内容并没有我想像的高端,具体是:
首先,看index位于的链表的前一半还是后一半(对size>>1 得出中间数,然后判断index和size>>1的关系得知)
然后,如果index在链表的前半部分,就正向遍历,如果index在链表的后半段,则是从末尾开始遍历
这是LinkedList中根据给定的索引index获取元素的实现:
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
当打算源代码的时候,如果其中的大部分内容已经知道个大概了,只有一些细节不清楚,这种状态下,收获最大,完全不知道,或者完全知道的时候,看源代码都没有什么意思,这是一直以来我的学习心得。
标签:
原文地址:http://my.oschina.net/ericliuandhisfriends/blog/484671