<转>ArrayList与Vector的区别

1) vector 线程同步 的,所以它也是线程安全 的,而arraylist 线程异步 的,是不安全的 。如果不考虑到线程的安全因素,一般用 arraylist效率比较高。

2) 如果集合中的元素的数目大于目前集合数组的长度时,vector 增长率为目前数组长度的100%,arraylist 增长率为目前数组长度的50% .如果在集合中使用数据量比较大的数据,用vector有一定的优势。

3) 如果查找一个指定位置的数据vector和arraylist使用的时间是相同 的,都是O(1) ,这个时候使用vector和arraylist都可 以。

而如果移动一个指定位置的数据花费的时间为O(n-i)n为总长度 ,这个时候就应该考虑到使用linklist ,因为它移动一个指定位置的数据所花费 的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)

 

 

使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据 或是在集合的末尾增加、移除一个元素所花费的时间是一样的 ,这个时 间我们用O(1)表示。但是,果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i) ,其中n代表集合中元素的个数,i代表元素增 加或移除元素的索引位置。为什么会这样呢?因为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或
ArrayList都可以

如果是其他操作,你最好选择其他的集合操作类 。比如,LinkList 集合类在增加或移除集合中任何位置的元素所花费 的时间都是一样的—O(1),但它在索引一个元素的使用时比较慢O(i),其中i是索引的位置.

使用ArrayList 也很容易,因为你可以简单的使用索 引来代替创建iterator对象的操作。

LinkList 也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。

 

其实也可以使用一个简单的数组(Array )来代替Vector ArrayList 。尤其是对于执行效率要求高的程序更应如此。

因为使用数组(Array )避免了 同步、额外的方法调用和不必要的重新分配空间的操作。

vector同步arraylist不同步
vector的容器是按原容器的2倍递增
arraylist的容器是按原容器的3/2倍+1递增的
所以arraylist占的内存小一点

 

 

1)《Thinking   in   Java》上很明确地说了:Vector是一个java1.0/1.1遗留的类,是为了与老代码兼容而保留的。有了ArrayList以后,应该尽量使用 ArrayList而不是Vector。

2) 有人说,Vector可以同步,而ArrayList不能同步,是不对的。
正确的说法应该是:ArrayList(包括所有新一代的容器)可以选择性地使用同步,不需要时就不使用,而不是像Vector那样没有选择。

3) vector的同步是指方法上的同步,也就是说在他自己的方法里进行了同步,两个线程同时调用一个方法的时候不会出现问题,但如果一个线程里要想多次操作 vector而且不想在这个过程中被其他线程打扰的话,仍然需要手动加锁来控制.

所以除了必须要写java1.0/1.1兼容的代码,否则完全可以不考虑Vector

4) 在多线程访问的时候需要用到同步,一般情况下不用考虑.而且ArrayList的出现就是用来取代vector,在同步的情况下,可以使用下面的方法来得 到一个同步了的List

List   list   =   Collections.synchronizedList(new   ArrayList());

synchronized(list) {

Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext()) foo(i.next());
}
取值的时候必须在synchronized中

 

感觉ArrayList的使用率要比Vector高很多, 而且它还可以适当地利用同步, 同LinkList 也是后起之秀, 有着不一般的效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值