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 . 普通方法

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方法

void addFirst(E e);

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

E removeFirst();
E remove(); // 实际调用了removeFirst()

3 . 带last方法

void addLast(E e);
E getLast();
E removeLast();

1.2 offer/peek/poll系列

这个系列的获取和删除如果不存在则返回null
1 . 普通方法

boolean offer(E e);
E peek(); // 获取第一个
E poll(); // 删除并返回第一个

2 . 带first方法

boolean offerFirst(E e);
E peekFirst();
E pollFirst();

3 . 带last方法

boolean offerLast(E e);
E peekLast();
E pollLast();

1.3 pop/push系列

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大同小异。

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只是改变了原来的双向链表的实现方式。。。大家加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值