Java中Vector与ArrayList的区别?这是一个很常见的面试题目:)

Vector与ArrayList其实是非常相似的,不信,你可以看看源码,如果说真的有什么区别的话,大概有以下三点:

1:Vector比ArrayList出现的更早,因此早期的程序可能只支持Vector

2:Vector是多线程安全的,而ArrayList不是,这也决定了ArrayList效率要高于Vector

3:Vector与ArrayList都采用的是线性连续空间存储元素,当空间不足时,Vector增加原来空间的一倍,而ArrayList只增加原来空间的50%.

4:Vector可以设置增长因子,而ArrayList则不行

看看其核心实现源码,就可以知道了:

Vector如何支持多线程

    public synchronized void copyInto(Object[] anArray) {//看看那个synchronized关键字,是线程安全的吧
System.arraycopy(elementData, 0, anArray, 0, elementCount);
}

ArrayList源码中随便一个函数,你都是看不到关键字synchronized的

    public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}

所以从以上代码中可以看出的是Vector确实是线程安全的,而ArrayList则不是,因此ArrayList的效率要高于Vector,因为其不需要负责锁的打开与关闭。

Vector的内存增长速度

private void ensureCapacityHelper(int minCapacity) {
//获取容器当前的大小
int oldCapacity = elementData.length;
//如果增加元素后大小超过了当前容器的范围,则执行下面的逻辑
if (minCapacity > oldCapacity) {
Object[] oldData = elementData;
//从这里可以看出的是如果没有设置增长因子的话,则以2倍速度增长
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2);
//如果增长后仍然不足以存放新增的元素,则直接将其大小设置为新大小
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
//直接执行复制操作
elementData = Arrays.copyOf(elementData, newCapacity);
}
}

ArrayList的内存增长速度

public void ensureCapacity(int minCapacity) {
modCount++;
//获取当前容器的大小
int oldCapacity = elementData.length;
//如果填加一个元素后,新容器的大小minCapacity大于oldCapacity,则表示容器已
//无法存放元素了,执行下面的逻辑
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
//重新设定容器的大小,新容器的大小,为原来容器的150%倍+1
int newCapacity = (oldCapacity * 3)/2 + 1;
//容器增大后,如果还不够存放的话,就执行下面的逻辑
if (newCapacity < minCapacity)
//将容器的大小直接设为minCapacity
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
//这里会重新开僻空间,并将原来的元素copy进去
elementData = Arrays.copyOf(elementData, newCapacity);
}

从上面的代码中可以看出内存空间的增长速度,Vector要高于ArrayList,也可以看出Vector是有增长因子的,但是ArrayList是没有增长因子的。

[置顶] Vector ArrayList区别剖析的更多相关文章

  1. [置顶] Array ArrayList LinkList的区别剖析

    这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...

  2. [置顶] Android Sensor系统剖析(4.0)(下)

    Author:Harish_hu@qq.com 由于现在电脑上只有4.0的代码,考虑到代码差别也不大,所以下部分,就基于4.0来分析.  3:SensorManager 上一部分说过,开机后,syst ...

  3. [置顶] *p++/*++p区别-linux

    #include <stdio.h> main() { char * s = "123456"; char * p; p = s; printf( "%c\n ...

  4. ArrayList 和 Vector 的区别

    这两个类都实现了 List 接口( List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取 ...

  5. ArrayList和Vector的区别

    3.ArrayList和Vector的区别 答: 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种 ...

  6. 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结

    List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...

  7. 集合框架,ArrayList和Vector的区别,让arrayList线程安全的几种方案

    boolean add(E e) 将指定的元素添加到此列表的尾部. void add(int index, E element) 将指定的元素插入此列表中的指定位置. boolean addAll(C ...

  8. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  9. ArrayList与Vector的区别

    ArrayList与Vector的区别 相同 这两个类都实现了List接口. 他们都是有序集合. 不同 ArrayList实现不是同步的,Vector实现是同步的. ArrayList与Vector都 ...

随机推荐

  1. SWI-Prolog

    上个月突然看到Prolog这门语言,它特殊的语法吸引了我,但是经过我一段时间的学习,发现它也不像网络上传说的那样神奇,不过我依然对它很感兴趣,有前辈说Prolog本身并不强大,但是用来作为一门辅助语言 ...

  2. win8 iis7/iis8 安装、卸载、设置方法

    原文:win8 iis7/iis8 安装.卸载.设置方法 一.安装 自从升级到Win8之后,之前使用已经趋于熟悉的iis7.0被取而代之的是iis8.0,那么安装和获取方法也就产生的略微的变化,为了避 ...

  3. cuda vector addition

    http://webgpu.hwu.crhc.illinois.edu/ // MP 1 #include <wb.h> __global__ void vecAdd(float * in ...

  4. .net在arraylist用法

    1.什么是ArrayListArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本号,它提供了例如以下一些优点: 动态的添加和降低元素 实现了ICollection和IL ...

  5. 中国人被“清朝GDP世界第一”忽悠了!

    中国人被"清朝GDP世界第一"忽悠了!"鸦片战争前的清朝GDP世界第一",这一说法在中国流传非常广.追根溯源,最早提出这一观点的似乎是英国学者麦迪森,他的一项猜 ...

  6. 【Socket规划】套接字Windows台C语言

    [编译环境]:Visual Studio 2013 这是服务端实现流程. #include<stdio.h> #include<stdlib.h> #include<wi ...

  7. thinkphp学习笔记1—目录结构和命名规则

    原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...

  8. Nyoj Fire Station

    描述A city is served by a number of fire stations. Some residents have complained that the distance fr ...

  9. JavaScript编写了一个计时器

    初学JavaScript,用JavaScript编写了一个计时器. 设计思想: 1.借助于Date()对象,来不断获取时间点: 2.然后用两次时间点的毫秒数相减,算出时间差: 3.累加时间差,这样就能 ...

  10. R语言数据分析系列六

    R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...