LinkedList分析
2015-12-27 19:43
671 查看
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
由于LinkedList提供了一些可以使其作为栈、队列、双端队列的方法,下面就对这个方法做个总结。
1 . 普通方法
2 . 带first方法
3 . 带last方法
1 . 普通方法
2 . 带first方法
3 . 带last方法
这里的first就是e1元素,last就是e3元素。java1.7也取消了Entry类作为链表的载体,而采用了Node类,基本和Entry大同小异。
剩下来的方法操作跟原来的也就基本差不多,无非也就是同时维护了两个指针更方便于操作罢了。。。
比较1.6和1.7的源码在原理差不多查询,1.7只是改变了原来的双向链表的实现方式。。。大家加油。
########################################################################
参考之前,我先对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只是改变了原来的双向链表的实现方式。。。大家加油。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 从源码安装Mysql/Percona 5.5
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序