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是两种常用的动态数组实现,它们都属于集合框架的一部分,用于存储和操作对象。虽然它们在用途上相似,但在性能、线程安全性和同步机制等方面存在显著区别。以下是关于ArrayList...
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
ArrayList LinkedList Vector 区别 ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 ...
ArrayList 和 Vector 都是 Java 中的动态数组,但是它们之间有一些区别。 * ArrayList 是非线程安全的,而 Vector 是线程安全的。 * ArrayList 的性能比 Vector 高,因为 Vector 需要同步锁机制来保证线程安全。 * ...
在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...
ArrayList、LinkList和Vector的区别 ArrayList、LinkList和Vector是Java中三个常用的集合类,它们都实现了List接口,但是在实现方式和性能上有所不同。 ArrayList ArrayList是使用数组方式存储数据的,数组元素数...
Java中的ArrayList和Vector都是列表(List)接口的实现类,它们在功能上相似,但在细节上存在一些重要的差异。这两个类都是基于数组实现的,但它们的性能特点、线程安全性和扩容策略有所不同。 1. **扩容策略**: ...
ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们各自有特定的特性和使用场景。这里我们将深入探讨这三个类的性能对比,以及它们在不同操作下的表现。 ArrayList是基于动态数组实现的,它提供了随机...
- **非线程安全**:与Vector类相比,ArrayList没有对方法进行同步处理,因此它不是线程安全的。如果需要线程安全的列表,可以使用`Collections.synchronizedList`或者自定义同步机制。 #### 二、ArrayList的重要...
ArrayList和Vector的主要区别在于Vector使用了synchronized方法,线程安全,而ArrayList则没有。 ArrayList是Java中最常用的List实现类,它提供了高效的插入、删除和遍历元素的方法。ArrayList基于数组实现,故插入...
在 Java 集合框架中,ArrayList、Vector、LinkedList 是三个常用的 List 实现类,虽然它们都实现了 List 接口,但是它们在继承关系、实现接口、底层数据结构、扩容机制等方面存在着一些区别。 首先,从继承关系来看...
### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...
今天,我们将深入了解 Java 中的集合类别,包括 ArrayList、Vector、LinkedList 和 Map 等。 ArrayList ArrayList 是一种基于数组的集合类别,它可以存储大量的数据。ArrayList 的特点是:它可以动态地增加或减少...
List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List和ArrayList的区别。List是一个接口,而ArrayList是一个实现了...
在Java编程语言中,`java.util.Vector`是一个重要的集合类,它是`ArrayList`的早期版本,提供了线程安全的动态数组实现。这篇文章将对`Vector`类进行详细的总结,包括其特点、用法以及与`ArrayList`的区别。 1. **...
Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...
在 Java 集合框架中,`Vector` 和 `ArrayList` 是两种常用的动态数组实现。它们提供了灵活的数据存储方式,能够根据需要自动调整大小。然而,这两种类型的列表在同步性、性能等方面存在差异,这些差异决定了它们适用...
在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...
在Java集合框架中,ArrayList和Vector是两种常用的动态数组实现,它们都继承自AbstractList,并且实现了List接口。虽然它们在基本功能上相似,但在线程安全性和扩容策略上存在显著差异。 首先,让我们来看看...
ArrayList 在 Java 中是基于动态数组实现的,它实现了 List 接口并支持所有可选的列表操作。ArrayList 允许 null 元素,其内部通过一个 Object 数组存储元素,通过 get、add、remove 等方法提供对元素的操作。当需要...