您的位置:首页 > 其它

ArrayList和Vector的比较

2013-10-10 01:54 274 查看
http://www.cnblogs.com/muzongyan/articles/1782788.html

同步性
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