之前写程序似乎也没有怎么关注过底层的结构,最近正好遇到了链表的问题,于是仔细阅读了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; } }
当打算源代码的时候,如果其中的大部分内容已经知道个大概了,只有一些细节不清楚,这种状态下,收获最大,完全不知道,或者完全知道的时候,看源代码都没有什么意思,这是一直以来我的学习心得。
时间: 2024-11-12 14:48:23