from:http://www.zihou.me/html/2011/01/27/2721.html
谈谈ArrayList和Vector这两种链表,虽然关于这两种链表之间比较的文章或帖子非常多,但我也在这里记录一下。
对于这两种链表,恐怕很多程序员在面试的时候都可能会碰到ArrayList和Vector两者有何区别这样的问题。当然,我想很多程序员通过查找资料也都会了解到这两种类其实非常相似,但在应用场景上又有着本质的不同。
首先,两者的相同性在于:二者都是基于数组的实现,我们可以通过查看两者的源码知道这点:
ArrayList的构造函数及过程:
初始化一个元素数为10的数组
public ArrayList() {
this(10);
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
如果初始化值小于0,则会抛出一个异常,否则创建一个10个元素的Object数组。
Vector的构造函数及过程:
public Vector() {
this(10);
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
从上面可以看出,其实现也是基于数组来进行的。
至于二者的方法,大多都一样,比如得到某一元素的get(i)方法:
return (E) elementData[index];
都是通过数组的查找方式来得到。
但也不是所有的方法功能都是非常类似,比如add(E e)方法,其实现的机制就有很大不同,也就是数组的扩容上,因为当数组满了,而此时又要插入数据很显然就面临数组扩容的问题,而在这方面ArrayList和Vector是有着较大区别的,ArrayList的方法为:
public boolean add(E e) {
ensureCapacity(size + 1);�0�2 // Increments modCount!!
elementData[size++] = e;
return true;
}
其中的ensureCapacity方法为:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object minCapacity [] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
上面的做法是先在现有数组大小的基础上加1作为参数minCapacity传入,然后将Object数组的大小赋给一个变量oldCapacity,然后当minCapacity大于oldCapacity时,将现有数组赋给一个minCapacity数组,然后在目前数组大小的基础上乘以1.5再加1得到一个新的容量值,如果当前新的容量值还是小于minCapacity,则将minCapacity作为新的数组容量值,最后生成一个新的容量的数组。
至于Vector的add方法扩容方法,有兴趣的朋友可以自行去查看源码。
参看上面的说明,这两者似乎在应用上没有任何区别,但实际是这样的吗?如果你看到在Vector中有很多的synchronized后,应该能马上明白过来!是的,Vector适用于线程安全的应用场景,而Arraylist是非线程安全的!
两者大概的比较就是上面这些了,最后要说的是,两者由于都是基于数组实现,故大小也就是容量无限制,另外,在删除元素后,数组大小不会减小,要缩小数组容量,可以调用其trimToSize方法。
分享到:
相关推荐
Java中ArrayList和Vector的区别共2页.pdf.zip
本篇文章是对Java中Vector与ArrayList的区别进行了详细的分析介绍,需要的朋友参考下
详细介绍Java中ArrayList的使用方法以及与vector的对比
ArrayList LinkList Vector的区别 java开发 集合 collection
Java ArrayList Vector LinkedList map区别 各种集合的区别 写得非常详细
Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.
以下是对java中ArrayList与Vector的区别以及HashMap与Hashtable的区别进行了详细的解析。需要的朋友可以过来参考下
主要介绍了java ArrayList和Vector的区别详解的相关资料,并附简单实例代码,需要的朋友可以参考下
Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)
此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此...
List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 使用容器排序 Vector由于使用了synchronized方法(线程安全)
java8 源码 List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -> AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的...
javalist数据结构_Java数据结构-------List 三种List:ArrayList,Vector,LinkedList 类继承关系图 ArrayList和Vector通过数组实现,⼏乎使⽤了相同的算法;区别是ArrayList不是线程安全的,Vector绝⼤多数⽅法做了...
e:arraylist, vector, hashmap ,hashtable,linklist等的区别; f:String类的相关方法的使用 g:垃圾回收机制的相关知识,如优点,原理等; h:java的异常处理; i:工作流的相关知识;j:多线程问的也很多;k:其他,...
ArrayList、Vector、LinkedList 的区别.docx
能学到什么:ArrayList的源码分析,自动扩容和自动缩容的源码分析,相关参数的深度解析,从是什么,为什么,怎么做三个角度进行讲解,用通俗易懂的白话进行介绍,LinkedList和Vector以及ArrayList的区别以及使用场景...
主要为大家详细介绍了Java中Vector和ArrayList的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了java Vector和ArrayList的分析及比较的相关资料,Vector是多线程安全的,而ArrayList不是,本文主要做对比对这两个方法,需要的朋友可以参考下
ArrayList,Vector底层是由数组实现,LinkedList底层是由双线链表实现,从底层的实现可以得出性能问题ArrayList,Vector插入速度较慢,查询速度较快,而LinkedList插入速度较快,而查询速度较慢。再者由于Vevtor使用了...