黑马程序员技术交流社区

标题: 为什么我们应该一直使用ArrayList而不是Vector? [打印本页]

作者: 飞舞❤心动    时间: 2012-6-6 23:41
标题: 为什么我们应该一直使用ArrayList而不是Vector?
为什么Vector类认为是废弃的或者是非官方地不推荐使用?或者说为什么我们应该一直使用ArrayList而不是Vector  这个问题别人给我解释了一遍,但是我还是不懂....
作者: 罗文杰    时间: 2012-6-6 23:52
Vector和ArrayList底层都是数组数据结构,但是Vector的线程是同步的,所以效率低,ArrayList的线程是不同步的,效率比Vector高,所以一般用Vector来代替ArrayList,如果多线程的时候自己给ArrayList加锁就好了。
个人觉得Vector也不是完全不用,Vector的elements()方法能返回枚举对象,在使用SequenceInputStream的时候可以用到。不过这点用ArrayList的迭代器也可以做到,代码实现上相对麻烦点。
作者: 曹操    时间: 2012-6-7 00:47
|--Vector:内部是数组数据结构,是线程同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

曾经有一个知名的It网站对它们三个进行测试,结果Vector各方面都不如其他两个!速度相差很多毫秒
       
作者: 曹操    时间: 2012-6-7 00:48
Vector和ArrayList Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。
  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
  当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间


ArrayList和Vector在从指定位置取得元素,从容器的末尾增加和删除元素都非常的有效,所有的这些操作都能在一个常数级的时间(O(1))内完成。但是从一个其他的位置增加和删除一个元素就显得颇为费时,差不多需要的时间为O(n-i),这里的n代表元素个数,i代表要增加和删除的元素所在的位置。这些操作需花费更多的时间,因为你需要挨个移动i和更高位置的元素。那么,以上这些到底说明了什么呢?
  
  这意味着,如果你取得一个元素,或者从数组末尾增加或删除一个元素的话,随便你使用Vector和ArrayList。如果你想要对数组内容做其他操作的话,那么就为自己好另一个容器吧。比喻说,LinkedList可以在常数级时间(O(1))内为任意一个位置的元素增加和删除。但是,取得一个元素,会稍微慢一点,时间要用O(i) ,这个i是元素的位置。通过ArrayList也是很简单的,因为你可以简单使用一个索引,而不是构造一个iterator 。LinkedList也为每个插入的元素建立一个内部对象。所以,你也必须知道,同时产生了垃圾对象。
作者: 曹操    时间: 2012-6-7 00:49
以上部分是老师上课说的
作者: 陌花╮有意、    时间: 2012-6-7 09:39
ArrayList:底层的数据结构使用的数组结构 特点:查快改慢 线程不同步
LinkedList:底层使用的是链表数据结构 特点:改快查慢
Vector:底层是数组数据结构 线程同步。被ArrayList替代了
因为同步所以对效率有影响,建议使用ArrayList




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2