文章目录
  1. LinkedList源码分析
  2. 1. java1.6中LinkedList方法的总结
    1. 1.1 add/get/remove系列
    2. 1.2 offer/peek/poll系列
    3. 1.3 pop/push系列
  3. 2. java1.7分析

[TOC]

LinkedList源码分析

LinkedList源码分析,基于java1.6和java1.7的分析,由于1.6和1.7在实现上相差比较大,所以对于1.6的分析大家可以参考下以下的一个博文。

########################################################################
参考之前,我先对1.6实现的LinkedList做下简单的介绍。首先呢,LinkedList是基于链表的,这个大家都知道,所以源代码里面肯定维护了一个头指针(不保存数据,方便操作),但是为了检索性能和方便操作的情况下,java1.6实现了的是一个双向的链表,模型大致如下。

然后其余,剩下的也就是对这个双向链表的操作罢了。由于是一个链表结构,所以也就不存在类似于ArrayList的扩容一说。。

########################################################################
http://blog.csdn.net/jzhf2012/article/details/8540543
########################################################################
########################################################################

1. java1.6中LinkedList方法的总结

看完那位博主的讲解其实LinkedList也就那么回事,无非也就是对一个双向链表的操作。
由于LinkedList提供了一些可以使其作为栈、队列、双端队列的方法,下面就对这个方法做个总结。

1.1 add/get/remove系列

这个系列的获取和删除如果不存在是会抛出异常的。

  • 1 . 普通方法
1
2
3
4
boolean add(E e)void add(int index, E element);
E set(int index, E element);
E get(int index);
boolean remove(Object o); 和 E remove(int index);
  • 2 . 带first方法
1
2
3
4
5
6
7
void addFirst(E e);

E getFirst();
E element(); // 实际调用了getFirst()

E removeFirst();
E remove(); // 实际调用了removeFirst()
  • 3 . 带last方法
1
2
3
void addLast(E e);
E getLast();
E removeLast();

1.2 offer/peek/poll系列

这个系列的获取和删除如果不存在则返回null

  • 1 . 普通方法
1
2
3
boolean offer(E e);
E peek(); // 获取第一个
E poll(); // 删除并返回第一个
  • 2 . 带first方法
1
2
3
boolean offerFirst(E e);
E peekFirst();
E pollFirst();
  • 3 . 带last方法
1
2
3
boolean offerLast(E e);
E peekLast();
E pollLast();

1.3 pop/push系列

1
2
void push(E e); // 实际是addFirst();
E pop(); // 实际是removeFirst();不存在会抛出异常

2. java1.7分析

其实要是弄明白了1.6中的LinkedList,其实1.7也没有多大的难度,无非也就是改变了实现的方式。在java1.7中,取消了header的指针,而是维护了一个first指针和一个last指针,这两个指针都是存放数据的,模型如下。

这里的first就是e1元素,last就是e3元素。java1.7也取消了Entry类作为链表的载体,而采用了Node类,基本和Entry大同小异。

1
2
3
4
5
6
7
8
9
10
11
12
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;
}
}

剩下来的方法操作跟原来的也就基本差不多,无非也就是同时维护了两个指针更方便于操作罢了。。。
比较1.6和1.7的源码在原理上差不多,1.7只是改变了原来的双向链表的实现方式。。。大家加油。

文章目录
  1. LinkedList源码分析
  2. 1. java1.6中LinkedList方法的总结
    1. 1.1 add/get/remove系列
    2. 1.2 offer/peek/poll系列
    3. 1.3 pop/push系列
  3. 2. java1.7分析