`
esffor
  • 浏览: 1362901 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Vector还是ArrayList这是个问题

 
阅读更多
Vector 还是ArrayList――哪一个更好,为什么?
要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素:
l         API
l         同步处理
l         数据增长性
l         使用模式
下面针对这4个方面进行一一探讨
API
在由Ken Arnold等编著的《Java Programming Language》(Addison-Wesley, June 2000)一书中有这样的描述,Vector类似于ArrayList.。所有从API的角度来看这两个类非常相似。但他们之间也还是有一些主要的区别的。
同步性
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
 

分享到:
评论

相关推荐

    Vector 与ArrayList区别

    这意味着多个线程可以在没有外部同步的情况下安全地访问同一个 `Vector` 对象。 - **ArrayList**:是非同步的,不提供内置的线程安全性。如果多个线程同时访问 `ArrayList`,则需要外部同步机制来确保线程安全。 ...

    比较Vector、ArrayList和hashtable hashmap

    这意味着如果键不再被任何对象引用,那么即使在 WeakHashMap 中,这个键也会被垃圾收集器回收。这种方式可以防止内存泄漏,但也可能导致数据丢失。 总结: - Vector 和 ArrayList 都实现了 List 接口,其中 Vector ...

    ArrayList LinkedList Vector区别

    Vector 由于使用了 synchronized 方法,因此具有线程安全性,但是这也使得其性能比 ArrayList 差。 LinkedList 则使用双向链表实现存储,索引数据需要遍历链表,但是插入数据时只需要记录本项的前后项,即使插入...

    第8讲 对比Vector、ArrayList、LinkedList有何区别1

    在Java集合框架中,Vector、ArrayList和LinkedList都是List接口的实现,它们提供了有序集合的功能,允许根据位置进行元素的添加、删除和查找。然而,它们在设计和性能上有着显著的区别。 首先,Vector是Java早期...

    Java中ArrayList的使用方法以及与vector的对比

    这个示例中,我们首先创建了一个 ArrayList 对象,然后使用 `add` 方法将 10 个整数元素添加到 ArrayList 中,然后使用 `remove` 方法删除第 6 个元素,最后使用 `add` 方法再添加 3 个元素。 二、ArrayList 的重要...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    ArrayList Vector LinkedList 区别与用法.

    - **Vector** 是线程安全的,它的所有公共方法都被`synchronized`修饰,这意味着在多线程环境中,对Vector的操作不会导致数据不一致的问题。 - **ArrayList** 不具备线程安全性,如果在多线程环境下使用,需要外部...

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    ArrayList LinkedList Vector性能对比

    ArrayList的扩容策略是在容量达到一定阈值时,创建一个更大的数组并复制原有元素,这可能导致额外的内存开销。 LinkedList是一种双向链表实现,它允许高效地插入和删除元素(时间复杂度为O(1),只需修改相邻节点的...

    Java中Vector与ArrayList的区别详解

    Java中的ArrayList和Vector都是列表(List)接口的实现类,...在现代Java开发中,由于对线程安全的需求通常可以通过其他方式解决,`ArrayList`往往成为首选,而`Vector`由于其过时的设计和性能问题,已经较少被使用。

    对比Vector、ArrayList、LinkedList1

    - **线程安全**:Vector是线程安全的,因为它在每个公共方法上都添加了`synchronized`关键字,这意味着在多线程环境中,它的操作是线程安全的,但这也导致了其性能较低。 - **容量管理**:Vector内部使用对象数组...

    ArrayList LinkList和vector的区别

    ArrayList、LinkList和Vector是Java中三个常用的集合类,它们都实现了List接口,但是在实现方式和性能上有所不同。 ArrayList ArrayList是使用数组方式存储数据的,数组元素数大于实际存储的数据,以便增加和插入...

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    这意味着在多线程环境下,多个线程可以同时操作`Vector`而不会产生数据不一致的问题。但是,由于其同步机制,性能通常低于`ArrayList`。 4. **HashTable类**: `HashTable`是`Dictionary`类的子类,是一个键值对...

    Arraylist、Hashtable、Vector

    在单线程环境下,ArrayList通常比Vector更高效,因为Vector的每个操作都需要进行同步。 ArrayList和Vector之间的主要区别在于线程安全性和性能。ArrayList适合于非线程安全且对性能要求较高的环境,而Vector则适合...

    java Vector和ArrayList的分析及比较

    - `Vector`是线程安全的,这意味着在多线程环境中,多个线程可以同时访问并修改`Vector`,而不会出现数据不一致的问题。这是因为`Vector`的每个操作方法都使用`synchronized`关键字进行了同步,确保了在并发环境下...

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List和ArrayList的区别。List是一个接口,而ArrayList是一个实现了...

    vector定义及与ArrayList的比较

    这意味着多个线程同时访问或修改同一个`Vector`实例时不会发生数据不一致的问题。 - **ArrayList**:默认情况下,`ArrayList`的所有操作都不是线程安全的。如果需要在多线程环境中使用`ArrayList`,则需要外部进行...

    详解Java中Vector和ArrayList的区别

    - `Vector`提供了一个额外的方法`indexOf(obj, start)`,用于查找指定对象从指定位置开始的索引,而`ArrayList`没有这个方法。 5. **适用场景**: - `ArrayList`:适合于单线程环境,或者在插入和删除操作不频繁...

    《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm

    《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm

    JDK1.6中Arraylist,Vector,LinkedList源码

    在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...

Global site tag (gtag.js) - Google Analytics