下图是Collection的类继承图

从图中可以看出:Vector、ArrayList、LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的操作具有不同的效率。

ArrayList  就是动态数组,是Array的复杂版本,动态的增加和减少元素.当更多的元素加入到ArrayList中时,其大小将会动态地增长。

Vector 和ArrayList类似, 区别在于Vector是同步类(synchronized).因此,开销就比ArrayList要大。

LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比。它还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.

注意: 默认情况下ArrayList和Vector的初始容量都是10,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。

接下来将Vector 和ArrayList 、 ArrayList和LinkedList进行两两对比

ArrayList和Vector

先看一下构造方法

public Vector(int paramInt1, int paramInt2) //使用指定的初始容量和容量增量构造一个空的向量
public Vector(int paramInt) //使用指定初始容量其标准容量增量为零的空向量
public Vector() //使用指定的初始容量为10和容量增量为零的空向量
public Vector(Collection<? extends E> paramCollection) //构造一个包含指定 collection 中的元素的向量
public ArrayList(int paramInt) //构造一个具有指定初始容量的空列表
public ArrayList() //构造一个初始容量为10的空列表
public ArrayList(Collection<? extends E> paramCollection) //构造一个包含指定 collection 的元素的列表
Vector比Arraylist多一个构造方法,就是public Vector(int paramInt1,int paramInt2)这个构造方法,paramInt2就是容量增长,即增长因子,ArrayList中是没有的。

下面再来看看Arraylist和Vectora的add方法
  public boolean add(E paramE)
{
ensureCapacityInternal(this.size + 1);
this.elementData[(this.size++)] = paramE;
return true;
}
private void ensureCapacityInternal(int paramInt)
{
if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
paramInt = Math.max(10, paramInt);
}
ensureExplicitCapacity(paramInt);
}
private void ensureExplicitCapacity(int paramInt)
{
this.modCount += 1;
if (paramInt - this.elementData.length > 0) {
grow(paramInt);
}
}
private void grow(int paramInt)
{
int i = this.elementData.length;
int j = i + (i >> 1);
if (j - paramInt < 0) {
j = paramInt;
}
if (j - 2147483639 > 0) {
j = hugeCapacity(paramInt);
}
this.elementData = Arrays.copyOf(this.elementData, j);
}
 public synchronized boolean add(E paramE)
{
this.modCount += 1;
ensureCapacityHelper(this.elementCount + 1);
this.elementData[(this.elementCount++)] = paramE;
return true;
} private void ensureCapacityHelper(int paramInt)
{
if (paramInt - this.elementData.length > 0) {
grow(paramInt);
}
} private void grow(int paramInt)
{
int i = this.elementData.length;
int j = i + (this.capacityIncrement > 0 ? this.capacityIncrement : i);
if (j - paramInt < 0) {
j = paramInt;
}
if (j - 2147483639 > 0) {
j = hugeCapacity(paramInt);
}
this.elementData = Arrays.copyOf(this.elementData, j);
}

1、ArrayList在内存不够时默认是扩展50% + 1个;Vector是当增长因子>0,默认扩展增加一个增长因子,否则默认扩展1倍。

2、Vector的方法加了synchronized, 而ArrayList则没有。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销

LinkedList和ArrayList的区别

LinkedList和ArrayList的差别主要来自于ArrayList和LinkedList数据结构的不同:

1) 因为ArrayList是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。ArrayList获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。

2) 相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

3) 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

4) LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

  Vector       ArrayList  LinkedList
实现方式 数组来实现 数组来实现 双向链表
线程安全 方法加了synchronized    
效率  
查询快
在尾部添加效率高
在头部添加 要快很多
删除数据     要快很多
遍历  
for         :1062865 ns
foreach : 2413494 ns
Iterator :1276122 ns

遍历的时候:选 for

Iterator :1080352 ns
foreach : 2191874 ns
for         :84410739 ns

遍历的时候:选 Iterator

注:此文章来自:https://www.cnblogs.com/jadehy/p/6673928.html

 
 
 
 
 
 
 

java.util.ArrayList,java.util.LinkedList,java.util.Vector的区别,使用场合.的更多相关文章

  1. 论Java的ArrayList.add(e)和C++的vector.push_back(e)的区别

    Java的ArrayList和C++的vector很类似,都是很基本的线性数据结构.但是他们的表现却不同. 在工作中碰到一个问题就是,搞不清楚到底传进去的是一个新对象,还是当前对象的引用! 经过实战分 ...

  2. 解决No converter found for return value of type: class java.util.ArrayList

    十一月 02, 2018 7:37:44 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() f ...

  3. 解决java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList问题

    在spring + springmvc + mybatis框架中,我们配置接口对外返回json格式,但是报如下错误: 24-Oct-2017 17:42:23.495 严重 [http-nio-808 ...

  4. Java:ArrayList类小记

    Java:ArrayList类小记 对 Java 中的 ArrayList类,做一个微不足道的小小小小记 概述 java.util.ArrayList 是大小可变的数组的实现,存储在内的数据称为元素. ...

  5. 初涉java库--ArrayList

    我的车就差一个轮子啦,造好轮子,我就飞上天与太阳肩并肩啦,想想都激动.什么你要自己造轮子,是不是傻,商店里不都是别人造好的吗,又好又方便,只需一点money,你没有money,那你只能做个安静的美男子 ...

  6. JAVA I/O系统 Thinking in Java 之 File类

    File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此.它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称.如果它指的是一个文件集,我们就可以对此集合调用list ...

  7. Apache Thrift with Java Quickstart(thrift入门及Java实例)

    thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl ...

  8. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

  9. java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)

    package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...

随机推荐

  1. 跨源资源共享(CORS)

    一.跨源的定义一个“源”有三部分组成:协议.域名.端口.任一部分不一致即为跨源.比如:(http,example.com,80)和(https,example.com,443)就是不同的源.   二. ...

  2. 关于Activity

    Activity与界面 1.Activity相当于浏览器的标签.相当于空白的网页,界面相当于浏览器内的网页. 2.将Activity与界面绑定就相当于在浏览器内填写了相应的网页. 3.Activity ...

  3. easyui datagrid 本地json数据 实现删除

    html代码:<a href='javascript:void(0);' onclick='Delete(\""+ index +"\")' class= ...

  4. Java 重写hashCode() 时为什么要用 31 来计算

    在OSChina 中看到了一篇文章<Java 中正确使用 hashCode 和 equals 方法>,看到 hashCode 的方法体内的31比较有意思. 在Stackoverflow上找 ...

  5. Android 第三方类库简单使用之EventBus

    Android 第三方类库之EventBus 1 PS 工欲善其事必先利其器. Eventbus也是一款在开发中常用的利器 这篇也对EventBus的简单介绍和使用,与之前个xutils介绍的级别一样 ...

  6. 【Linux】动态链接函数库

    动静区别 1. gcc –c mylib.c –o mylib.o 2. gcc -shared -fPIC mylib.o -o libmylib.so 3. 将制作好的libmylib.so 复制 ...

  7. 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误

    利用adb shell进入系统,进入/data/app或者/data/data,删除跟你安装的apk同样的包名: 按Ctrl+C退出系统,利用adb pull /data/system/package ...

  8. 破解Power Designer 12.5

    PowerDesigner15.1破解补丁链接: https://pan.baidu.com/s/1boJoT6B 密码: 9x77 解压,将文件 pdflm15.dll替换安装目录的同名文件即可.

  9. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

  10. Selenium2学习(十四)-- 加载Firefox配置

    前言有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile_ ...