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),你可以避免同步,额外的方法调用,非理想化的大小改变。你付出的只是额外的开发时间。
分享到:
相关推荐
这意味着多个线程可以在没有外部同步的情况下安全地访问同一个 `Vector` 对象。 - **ArrayList**:是非同步的,不提供内置的线程安全性。如果多个线程同时访问 `ArrayList`,则需要外部同步机制来确保线程安全。 ...
如果对性能要求较高且无需线程安全,ArrayList 是一个好选择;如果频繁进行插入和删除操作,LinkedList 更合适;如果需要线程安全的 Map,应使用 Hashtable,而如果关心内存效率,WeakHashMap 是一个选项。
ArrayList的扩容策略是在容量达到一定阈值时,创建一个更大的数组并复制原有元素,这可能导致额外的内存开销。 LinkedList是一种双向链表实现,它允许高效地插入和删除元素(时间复杂度为O(1),只需修改相邻节点的...
由于线程安全的特性,如果不特别需要线程安全,通常不推荐使用Vector,因为无锁的ArrayList在单线程环境下性能更好。 ArrayList是更常用的选择,它同样基于动态数组实现,但非线程安全。ArrayList在需要时会调整...
本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解它们之间的差异。 #### 一、ArrayList与Vector **1. 存储方式** - **ArrayList** 和 **Vector** 都采用动态数组的...
- `LinkedList`虽然在随机访问上不如`ArrayList`和`Vector`,但在插入和删除操作上表现更好,因为它只需要修改相邻元素的链接,时间复杂度为O(1),但遍历速度慢。 5. **使用场景**: - 如果在单线程环境中,且...
如果需要线程安全的哈希表,可以使用ConcurrentHashMap,这是Java并发编程库中的一个类,它在多线程环境下提供了更好的性能。 总的来说,ArrayList适用于需要随机访问和快速遍历的场景;Hashtable适用于需要线程...
### Vector定义 `Vector`是Java中的一种动态数组实现,属于`java.util`包下的类。...然而,在大多数现代应用程序中,推荐使用`ArrayList`,因为它提供了更好的性能,并且能够更好地与其他Java集合框架组件协同工作。
这使得ArrayList在大多数情况下比Vector有更好的性能。 - **效率**:由于没有线程安全的开销,ArrayList在单线程环境中的效率更高,特别适合于频繁进行随机访问和尾部插入、删除操作的场景。 3. **LinkedList** -...
- 当容量需要扩展时,ArrayList和Vector都会创建一个新的更大容量的数组,然后将旧数组的数据复制到新数组中。但是,Vector每次增长的容量是原来的两倍,而ArrayList则是原容量加上50%。这意味着在频繁添加元素的...
- `Vector`提供了四个构造方法,除了`ArrayList`的三个方法外,还有一个带有容量增量参数的构造方法,允许用户自定义容量扩展时的增长量。 4. **性能影响**: - 由于`Vector`的线程安全特性,其方法调用通常比`...
它的内部是一个Object类型的数组,当添加元素导致容量不足时,会自动扩容。扩容策略通常是将原容量翻倍,以减少扩容次数,提高效率。在JDK 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能...
现在,通常推荐使用`ArrayList`并配合`Collections.synchronizedList()`来实现线程安全的列表,以获得更好的性能。 `Map`接口是`java.util.Map`,它定义了一种键值对的数据结构。`Map`不包含列表的顺序,而是通过键...
- `Vector`:在多线程环境且对线程安全有严格要求的场景下使用,但通常由于性能原因,现在更倾向于使用`Collections.synchronizedList()`来同步一个`ArrayList`,而不是直接使用`Vector`。 总的来说,`ArrayList`...
Java 集合类别详解 Java 是一种基于对象的编程语言,它提供了多种集合类别来存储和操作数据。...了解集合类别的特点和优点,可以帮助我们更好地选择和使用合适的集合类别,以提高程序的性能和可读性。
此外,`std::vector`是C++标准库中一个功能强大的动态数组,它自动处理内存管理,但在仿照Java的ArrayList时,我们可能需要手动实现这些功能,以便更好地理解数据结构的底层运作。 1. **类定义**:ArrayList类应该...
`Vector`类的所有公共方法都是同步的,这意味着它在多线程环境中具有更好的安全性。而`ArrayList`是非同步的,如果在多线程环境下使用,需要自行处理同步问题。对于不需要线程安全的场景,`ArrayList`的性能会优于`...
如果你的程序需要在多线程环境中运行,使用 Vector 可能是一个更好的选择。 Vector 是一个功能强大的集合类,提供了多种操作方法和灵活的容量管理机制。它广泛应用于 Java 编程中,特别是在需要动态数组功能的情况...
- 当需要频繁地访问列表中的元素时,`ArrayList`和`Vector`都能很好地支持,但`ArrayList`通常表现更好。 通过了解`Vector`的特点及其与其他集合类型的比较,开发者可以根据实际需求选择最适合的集合类型来构建高效...
- 非线程安全:`ArrayList`不是线程安全的,如果多个线程共享一个`ArrayList`实例,并且至少一个线程修改了列表结构,那么必须保持外部同步。 - 性能考虑:对于随机访问,`ArrayList`的性能优于`LinkedList`,但...