Vector和LinkedList学习记录

来源:互联网 发布:王尼玛 知乎 五五开 编辑:程序博客网 时间:2024/06/08 08:34

前一节,我们了解了Arraylist的一些知识,在实际的开发中,Arraylist使用是远远高于Vector和LinkList,但是我毕业那会,面试题,最长见的几个问题就有,分析ArrayList,Vector,LinkedList的区别。
首先这个这三个类都实现了List的接口。

这3个类在调用的方法和使用方法是一样的:例如下
List list = new ArrayList<>();
List list = new Vector<>();
List list = new LinkedList<>();
那么首先分析下Vector的代码:
Vector的继承关系如下,和ArrayList并没有什么区别
这里写图片描述
粗略的翻了Vector的源码,会发现这代码和ArrayList的代码是一样,唯一不同的就是,Vector在方法中加了一个synchronized 同步,如下的add的方法。

public synchronized boolean add(E e) {    modCount++;    ensureCapacityHelper(elementCount + 1);    elementData[elementCount++] = e;    return true;}

所以这里就明白了,ArrayList和Vector同时实现了动态的数组,但是,Vector是线程安全的,对应的性能就低。
至于为什么现在ArrayList比Vector使用的广泛的多的原因就是。在开发的工程中,这里举例一个web请求,在一个web的请求过来,那么就可以理解是一个单独的线程,每一个请求都是一个单独线程,在线程内部定义的一个集合类不会存在数据的共享,也不会存在线程的安全不安全的问题了。

在来看看LinkedList的继承关系:
这里写图片描述
这里和ArrayList和Vector稍微有点不同,该类实现了Deque这个接口,在Deque又继承了了Queue。Deque这个类看下源码介绍说的是 “A linear collection that supports element insertion and removal at both ends” 翻译就是 “一种支持向两端插入和删掉的线性集合”。那么LinkedList和其它的2个兄弟不同了,它不是用数组实现了,而是基于链表的。

看下LinkedList的add()方法中调用了linkLast()方法,linkLast()的方法实现如下:(在添加元素做为最后一个元素)

void linkLast(E e) {    final Node<E> l = last;    final Node<E> newNode = new Node<>(l, e, null);    last = newNode;    if (l == null)        first = newNode;    else        l.next = newNode;    size++;    modCount++;}

这段代码的意思大概就是,定义一个node,放3个元素(自身元素的值,前一个元素的节点(Node),以及一个null元素),在使用add(E e)方法添加元素的时候,需要把前一个元素的next指向自己。
这样看来,LinkedList用add(E)方法在添加一个元素的时候,时间复杂度为O(1)如果ArrayList使用的是add(E)这个返回的时候,也是O(1)。
不过在使用add(int, E)的方法的时候,在LinkedList中如果不是最后一个元素的话,调用的是linkBefore(e, node(index))这个方法。

Node<E> node(int 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;    }}

先查找判断index为前一半还是后一半(分治的思想),然后从第一个指针开始往后找。

所以总结下,Arraylist和LinkList和使用的时候,LinkedList,在删除和添加效率比Arraylist高,在找到指定元素的时候,ArrayList的效率要好一点。
不过这里的添加元素只是针对于随机位置的添加,如果是一直添加在末位,那么Arraylist和linkList是没有什么区别的。

爱代码,更爱生活。如果有什么错误或者想法交流的,希望大家加我的qq:1416011240。学习不仅仅是知识,还有做人的道理。谢谢