Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
Vector继承自AtrastractList,实现了 Serializable, Cloneable, Iterable, Collection, List, RandomAccess 的接口。
每个Vector会试图通过维护 capacity
和 capacityIncrement
来优化存储管理。capacity
始终至少应与向量的大小相等;这个值通常比后者大些,因为随着将组件添加到向量中,其存储将按 capacityIncrement
的大小增加存储块。应用程序可以在插入大量组件前增加向量的容量;这样就减少了增加的重分配的量。
构造函数Vector(),实现一个空向量,其内部数组大小为10,标准容量增量为0。
目前看来,Vector和ArrayList很像,二者的区别可参见以下比较(摘自http://java.chinaitlab.com/advance/37954.html):
Vector 和 ArrayList的不同
有的时候 Vector更好一些;有的时候ArrayList 更好一些;有的时候你一个也不想用。但愿,你不是在期望一个简单明了的答案,因为答案因你在用他们做什么而定。下面是要考虑的四个方面:
API
同步-Synchronization
数据增长-Data growth
使用方法-Usage patterns
让我一个一个来解释吧。
API
在The Java Programming Language (Addison-Wesley, June 2000) 中Ken Arnold, James Gosling, 和 David Holmes 是这样描述Vector的,它是更ArrayList类似的一个东西,所以从API的观点来看,它们俩是很相似的。但是,它们之间还是有些微的差别的。
Synchronization
Vectors是可同步化的,意思就是说,任何操作Vector的内容的方法都是线程安全的,相反的,另一方面,ArrayList是不可同步化的,所以也不是线程安全的。如果你知道了这些的话,你就会发现,Vector的同步会让它在性能发方面有一些小问题。所以,如果你不需要线程安全的话,那么就使用ArrayList吧。为什么要为没有必要的同步付出代价呢?
Data growth
实际上,不管是ArrayList还是Vector,在它们内部都是使用一个Array来保存数据的。编程过程中,在使用它们任何一个的时候,你都需要记住这一点。你在往一个ArrayList或者Vector里插入一个元素的时候,如果内部数组空间不够了,这个对象(译者按:指的是你使用的ArrayList或者Vector)就要扩展它的大小。Vector在默认情况下是产生一个双倍大小,而ArrayList增加50%的大小。只要你合理的使用这些类,你就可以结束你在增加新的元素的时候所付出的性能代价。把对象(译者按:指的是你使用的ArrayList或者Vector)的初始化容量指定为你编程过程中所能用到的最大的容量总是最好的办法。仔细的指定容量,你可以避免以后改变内部Array容量,所要付出的代价。如果你并不知道到底有多少个数据,但是你知道数据的增长率,Vector确实有一点点优势,因为你可以指定增加值(译者按,如果没有猜错的话,作者说的方法应该是setSize(int newSize) Sets the size of this vector.)。
Usage patterns
ArrayList和Vector在从指定位置取得元素,从容器的末尾增加和删除元素都非常的有效,所有的这些操作都能在一个常数级的时间(O(1))内完成。但是从一个其他的位置增加和删除一个元素就显得颇为费时,差不多需要的时间为O(n-i),这里的n代表元素个数,i代表要增加和删除的元素所在的位置。这些操作需花费更多的时间,因为你需要挨个移动i和更高位置的元素。那么,以上这些到底说明了什么呢?
这意味着,如果你取得一个元素,或者从数组末尾增加或删除一个元素的话,随便你使用Vector和ArrayList。如果你想要对数组内容做其他操作的话,那么就为自己找另一个容器吧。比如说,LinkedList可以在常数级时间(O(1))内为任意一个位置的元素增加和删除。但是,取得一个元素,会稍微慢一点,时间要用O(i) ,这个i是元素的位置。通过ArrayList也是很简单的,因为你可以简单使用一个索引,而不是构造一个iterator 。LinkedList也为每个插入的元素建立一个内部对象。所以,你也必须知道,同时产生了垃圾对象。
最后,Practical Java (Addison-Wesley, Feb. 2000) Peter Haggar 里的“实践41“建议你使用一个普通的原始的数组来代替Vector和ArrayListe,特别是对效率优先的代码来说。通过使用数组(array),你可以避免同步,额外的方法调用,非理想化的大小改变。你付出的只是额外的开发时间。
分享到:
相关推荐
### Java Vector详解 #### 一、Vector简介 `Vector`是Java集合框架中的一部分,它类似于数组,但具有动态扩展的能力。与`ArrayList`不同的是,`Vector`提供线程安全的方法来操作其元素,因此在多线程环境中更为...
Java中的`Vector`类是Java集合框架的一部分,它在`java.util`包中定义,作为一个动态数组,提供了线程安全的容器。`Vector`类在早期的Java版本中被广泛使用,但在现代Java编程中,由于其性能上的限制,通常被`...
### Java Vector 的相关知识 #### 一、简介与特点 `Vector`是Java集合框架中的一个类,它在早期版本的Java中被广泛使用。它实现了`List`接口,并提供了线程安全的方法来操作列表元素。`Vector`的实现基于数组,...
Java 中 Vector 的用法 Java 中的 Vector 是一个动态数组,提供了可增长的数组功能,能够根据需要自动扩展或收缩容量。下面我们将详细介绍 Vector 的用法和相关知识点。 Vector 的构造函数 Vector 类提供了三个...
Java Vector类是Java集合框架中的一个古老成员,它在Java早期版本中就已经存在,比ArrayList和LinkedList等集合类出现得更早。Vector类是线程安全的,这意味着在多线程环境中,它提供了同步访问机制,确保了数据的...
### Java中的Vector定义与用法详解 #### 一、Vector简介 `Vector`是Java集合框架中的一个类,它提供了一种线程安全的动态数组实现。与`ArrayList`不同,`Vector`在多线程环境中能确保数据的一致性和安全性,这主要...
在Java编程语言中,`Vector`类是`ArrayList`的一个早期版本,它提供了一种动态数组的概念,允许我们在数组大小已知或未知的情况下添加、删除和访问元素。`Vector`类位于`java.util`包中,它实现了`List`接口,因此与...
在Java编程语言中,`Vector`类是Java集合框架的一部分,它被用来创建和管理动态数组,也就是一种线性数据结构。线性表是一种基本的数据结构,其中元素按顺序排列,每个元素都有一个前驱和后继(除了首元素和尾元素)...
Java中的String、Vector和Scanner是三个非常基础且重要的概念,对于初学者来说,理解它们的用法和原理是学习Java编程的关键步骤。 首先,我们来深入理解`String`类。在Java中,`String`是一个不可变的字符序列,这...
由Java实现的二维向量类,包含向量的所有基本运算。可以表示平面中的一个点或一个向量。
在C++编程中,`std::vector`是一个非常重要的容器,它提供了动态数组的功能,允许我们在运行时方便地增加或减少元素数量。然而,对于学习和理解C++内存管理和容器实现原理,尝试自己编写一个类似`std::vector`的数据...
深入分析JAVA Vector和Stack的具体用法 JAVA 中的 Vector 和 Stack 是两个重要的数据结构, Vector 是一个线程安全的动态数组,而 Stack 是一个继承自 Vector 的栈结构。本文将对 Vector 和 Stack 进行深入分析,...
Java中的ArrayList和Vector都是List接口的实现类,它们都是基于数组实现的动态数组,用于存储对象的有序集合。然而,两者在设计和使用上有显著的区别,主要体现在以下几个方面: 1. **线程安全性**: - `Vector`是...
【JAVA Vector 源码解析和示例代码】 在Java编程语言中,`Vector`类是集合框架的一部分,早在JDK 1.0版本就已经存在。`Vector`类继承自`AbstractList`并实现了`List`, `RandomAccess`, `Cloneable`等接口,提供了...
在Java编程语言中,`Vector`是`java.util`包中的一个类,它是一个动态数组,可以在运行时自动调整大小。`Vector`类是线程安全的,这意味着它在多线程环境中可以被多个线程同时访问而不会出现数据不一致的问题。然而...
Java Vector详解及实例 Java Vector是Java语言中的一种动态数组实现,可以实现自动增长的对象数组。Vector类提供了大量的方法来方便用户的使用,例如插入、删除、查询等操作。 Vector类的介绍 Java中没有指针的...
在编程领域,特别是Java或C++等语言中,向量(Vector)是一种常见的数据结构,用于存储动态大小的有序元素序列。这篇博客“Vector初始化的各种写法”可能探讨了如何在程序开始时设置和填充一个Vector对象的不同方法...
Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...