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。学习不仅仅是知识,还有做人的道理。谢谢
- Vector和LinkedList学习记录
- ArrayList、Vector和LinkedList
- LinkedList、ArrayList和Vector
- LinkedList,ArrayList和Vector
- ArrayList、Vector和LinkedList
- ArrayList、Vector和LinkedList
- ArrayList、LinkedList和Vector
- ArrayList、Vector和LinkedList
- Vector和LinkedList
- ArrayList、Linkedlist和Vector
- LinkedList,ArrayList和Vector
- Java 集合深入学习--ArrayList,LinkedList和Vector
- ArrayList、Vector、LinkedList学习例子
- ArrayList、Vector、LinkedList学习例子
- ArrayList、Vector、LinkedList学习例子
- vector和arrayList,LinkedList区别
- 比较 ArrayList,LinkedList 和 Vector。
- vector和arrayList,LinkedList区别
- 求n个正整数连接成一排,组成一个最大的多位整数
- UVA.1262 Password ( dfs求字典序第k大 )
- 二极管选型重要参数
- 在线人数统计
- java基础学习总结——java读取properties文件总结
- Vector和LinkedList学习记录
- centos 更改yum 源
- C语言数据类型总结
- ContentProvider启动过程and多进程调用全过程源码详解
- 等价表达式
- java属性拾取器
- Codeforces Round #432 (Div.2)
- 使用反射、特性简化代码
- java基础学习总结——面向对象2