读书人

自个儿动手写写:LinkedList源码浅析

发布时间: 2012-10-26 10:30:59 作者: rapoo

自己动手写写:LinkedList源码浅析

上篇文章浅析了ArrayList的源码相关内容!这篇文章将介绍LinkedList相关的内容!

?

二. LinkedList

?

先来看看LinkedList的类结构!

前面的我就不说了,都是一些预判断。我们来分析下下面这段代码的含义

图一


自个儿动手写写:LinkedList源码浅析

图二
上面我描述的过程就类似于从图一到图二的过程。

?

初步感性的分析玩之后我们来详细分析一下!

这里做了一个判断:如果当前插入的index的值等于size则返回header,否则返回entry(index);

1. index == size时,其实就是插入到链尾处,因为链尾处的元素的next比较特殊,它指向了链首header。

2. index != size时,我们先来看一下entry(int index)这个方法的源码:

其实就是找到找到索引值为index的Entry,判断index值大小是否已经超过了size值的一半,如果没超过就从链表头部开始遍历,否则从链表尾部开始遍历。

ps:看得出来,按索引找个Entry这么麻烦,真慢,不像ArrayList来得那么直接。这就是为什么LinkedList索引慢的原因,存储结构决定的,基因问题,呵呵。

?

3. Entry<E> predecessor = successor.previous; 鉴于上面的分析,这句也就不难理解了。

4.

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable

?Vector用得并不多,它和ArrayList很相似,但是它本身是线程安全的,看源码就能够看得出来,很多方法都是synchronized,但是在jdk1.6上就已经有java.util.concurrent了,对于多线程编程的话,Vector的用武之地也很少了,这里就不再讲了!

?

?

ps:附件中我上传了一个比较不错的Data Structure Visualzation工具,是一个jar包运行java -jar 执行。对于分析与理解数据结构方面的问题相当有帮助。

读书人网 >编程

热点推荐