Vector和LinkedList学习记录

前一节,我们了解了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。学习不仅仅是知识,还有做人的道理。谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值