Java中的Vector和ArrayList区别及比较

所属分类: 软件编程 / java 阅读数: 50
收藏 0 赞 0 分享

Vector  和  ArrayList 比较

有时用Vector更好一点,有时用ArrayList更好一点,不能准确容易的给出答案,因为要视具体情况而定,有四个主要考虑的因素:

1:API
2: 同步(synchronization)
3:数据增长(Data  growth)
4:使用模式(Usage  pattern)

下面分别意义探讨:

1:API

在Ken Arnold, James Gosling, and David Holmes 的 Java 程序语言的描述中,Vector和ArrayList是类比设计的,从API 的角度来看,两个类有很多相似性,但是两个类也有一些不同。

2:同步(Synchronization)

从同步性的角度考虑 :  Vector是同步的,一些访问Vector的内容的方法是线程安全的,而ArrayList是非同步的,访问ArrayList的内容的方法是线程不安全的,因为有这个不同,使用synchronized关键字修饰的,将会在性能上有所下降,因此如果你不需要一个线程安全的集合,使用ArrayList。不用花费不必要的synchronization性能开销。

3:数据增长(Data   growth)

从内部的数据结构来看,ArrayList 和 Vector都是使用  数组(Array)的模式存放内容,你需要在程序设计中小心这个本质,当在 ArrayList和 Vector中插入数据时,如果ArrayList或 Vector的对象存储超出了对应的空间(即内部数组长度)。对应的ArrayList或 Vector将会扩充它们的内部的数组。 Vector默认扩充内部数组的一倍,就是相当于两个以前的数组的大小,而ArrayList仅仅增加50%的大小,根据你使用哪个类来确定增加一个元素的性能影响,最好的方式就是设置对象的初始化容量为需要的最大容量,这样能够避免以后插入元素后的自增长,(自增长会涉及到数组内部元素的复制到新创建的数组中),如果你不知道数据将增长到多大,但是你知道数据增长的速率,Vectory能够拥有轻微的优势,因为你能够设置增长的值。

至于为什么要把 Vector设置为同步和自增长为自身大小的一倍而ArrayList设置为非同步自增长为自身大小的一半:

八卦一下:设置为同步说明数据增长比较激烈,就是增长速率和频率较大,如果设置为一半,很快数组又满了,所以设置为一倍。

而ArrayList相应的 增长速率慢,设置为不同步,不容易出现多线程并发问题。
八卦只是个人理解,欢迎拍砖。

4:使用模式(usage pattern)

ArrayList和Vector都是比较好的在检索特定位置 的元素的时候以及在集合的末尾增加和移除元素,所有以上的操作都是在O(1)的线性时间,但是如果增加和移除一些别的位置的元素(非最末尾位置)需要更昂贵的线性时间开销为O(n-i),n代表了元素的总个数,i代表了插入或移除的索引位置,这些操作代价更大,因为不得不移动索引i后端所有的元素,这意味着什么呢?

这意味着你先查找到索引为以及 i 以后 的元素,然后在数组的末尾插入和移除该元素。如果你想做插入或删除,可以考虑一些别的集合类,例如:LinkedList能够增加或移除一些位置的元素在常量时间O(1)内,但是索引元素的位置比较慢,需要O(i)的时间开销,i 是需要的元素的索引,遍历ArrayList是很容易的,因为你能够简单的使用索引代替创建一个迭代器,LinkedList也为每一个插入的元素创建一个内部的对象,因此你必须意识到额外的垃圾被创建。

最后声明:你能够使用最普通的数组来代替Vector或者ArrayList,尤其是因为标准代码的性能,使用数组能够避免同步(synchronization),额外的方法调用,最适度的调整大小,你仅仅需要花费额外的开发时间。通过array能够为您的程序量身定做需要的集合。

更多精彩内容其他人还在看

利用MultipartFile实现文件上传功能

这篇文章主要为大家详细介绍了利用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java编程实现NBA赛事接口调用实例代码

这篇文章主要介绍了Java编程实现NBA赛事接口调用实例代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java编程之双重循环打印图形

这篇文章主要介绍了Java编程之双重循环打印图形,属于Java编程基础练习部分,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

java基础学习JVM中GC的算法

这篇文章主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。
收藏 0 赞 0 分享

Java编程Post数据请求和接收代码详解

这篇文章主要介绍了Java编程Post数据请求和接收代码详解,涉及enctype的三种编码,post与get等相关内容,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Retrofit+Rxjava实现文件上传和下载功能

这篇文章主要介绍了Retrofit+Rxjava实现文件上传和下载功能,文中提到了单文件上传和多文件上传及相关参数的请求,需要的朋友参考下吧
收藏 0 赞 0 分享

Retrofit+Rxjava下载文件进度的实现

这篇文章主要介绍了Retrofit+Rxjava下载文件进度的实现,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java检查服务器的连通两种方法代码分享

这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java/Android 获取网络重定向文件的真实URL的示例代码

本篇文章主要介绍了Java/Android 获取网络重定向文件的真实URL的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java并发编程之同步器代码示例

这篇文章主要介绍了java并发编程之同步器代码示例,分享了相关代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享
查看更多