黑马程序员技术交流社区
标题:
集合问题
[打印本页]
作者:
平凡成就非凡
时间:
2014-3-12 17:27
标题:
集合问题
Arraylist 和Voter的区别是什么?
作者:
Aenon
时间:
2014-3-12 17:42
ArrayList是Vector的优化,功能上没多大区别,ArrayList书写更简便,除了枚举取元素用Vector,一般用ArrayList。
作者:
欢欢
时间:
2014-3-12 17:52
ArrayList:底层是数组数据结构。特点:查询速度很快,但是增删较慢。线程不同步。
Vector:底层是数组数据结构。线程同步。被ArrayList代替了。JDK1.0版本。
List集合特有的迭代器:ListIterator
Vector中的特有方法:枚举就是Vector特有的取出方式。
其实枚举和迭代是一样的。因为枚举的名称和方法的名称都过长。所以被迭代器取代了。
作者:
牛头人图腾
时间:
2014-3-12 18:11
1、相同点:都是list下的子类(底层是数组结构),有序的(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
2、不同点:(1)Vector:线程同步的,Vector无论查询和增删都巨慢。(2)Arraylist线程不同步,查询元素的速度非常快。vector从jdk1.0就开始有了,现在基本上使用Arraylist了,vector比较少用。
作者:
欧阳疯
时间:
2014-3-12 18:24
Vector类和ArrayList类的主要不同之处在于同步。除了两个只用于串行化的方法,没有一个ArrayList的方法具有同步执行的能力;相反,Vector的大多数方法具有同步能力,或直接或间接。因此,Vector是线程安全的,但ArrayList不是。这使得ArrayList要比Vector快速。对于一些最新的JVM,两个类在速度上的差异可以忽略不计:严格地说,对于这些JVM,这两个类在速度上的差异小于比较这些类性能的测试所显示的时间差异。
通过索引访问和更新元素时,Vector和ArrayList的实现有着卓越的性能,因为不存在除范围检查之外的其他开销。除非内部数组空间耗尽必须进行扩展,否则,向列表的末尾添加元素或者从列表的末尾删除元素时,都同样有着优秀的性能。插入元素和删除元素总是要进行数组复制(当数组先必须进行扩展时,需要两次复制)。被复制元素的数量和[size-index]成比例,即和插入/删除点到集合中最后索引位置之间的距离成比例。对于插入操作,把元素插入到集合最前面(索引0)时性能最差,插入到集合最后面时(最后一个现有元素之后)时性能最好。随着集合规模的增大,数组复制的开销也迅速增加,因为每次插入操作必须复制的元素数量增加了。
只要不需要同步就用ArrayList,事实上ArrayList的存在基本上就是为了淘汰Vector,因为大多数情况下我们只是需要一个动态存储器,而不涉及同步问题。当然,考虑到有可能会有同步的需要以及像以前版本兼容Vector依然本保留下来。
作者:
一诺千金
时间:
2014-3-12 19:13
一个同步,一个不同步,而且Vector效率巨低
作者:
橸瑩膤漃寞林
时间:
2014-3-12 19:52
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢,线程不同步。
Vector:底层是数组数据结构,线程同步,被ArrayList替代了。
作者:
周定宁
时间:
2014-3-12 20:01
两个用法差不多,都是实现List接口,区别在于Vector是已同步的,所以效率上比较低一些。一般,在不需要同步时应该使用ArrayList,反之使用Vector。可以看一下文档或源码。 j2se doc上面很清楚,The arraylist class is roughly equivalent to Vector, except that it is unsynchronized. 及多个线程同时使用一个arraylist时,当又一个线程改变了arraylist的内容时
需要用Collections.synchronizedList来同步
Vector类和ArrayList类的主要不同之处在于同步。除了两个只用于串行化的方法,没有一个ArrayList的方法具有同步执行的能力;相反,Vector的大多数方法具有同步能力,或直接或间接。因此,Vector是线程安全的,但ArrayList不是。这使得ArrayList要比Vector快速。对于一些最新的JVM,两个类在速度上的差异可以忽略不计:严格地说,对于这些JVM,这两个类在速度上的差异小于比较这些类性能的测试所显示的时间差异。
通过索引访问和更新元素时,Vector和ArrayList的实现有着卓越的性能,因为不存在除范围检查之外的其他开销。除非内部数组空间耗尽必须进行扩展,否则,向列表的末尾添加元素或者从列表的末尾删除元素时,都同样有着优秀的性能。插入元素和删除元素总是要进行数组复制(当数组先必须进行扩展时,需要两次复制)。被复制元素的数量和[size-index]成比例,即和插入/删除点到集合中最后索引位置之间的距离成比例。对于插入操作,把元素插入到集合最前面(索引0)时性能最差,插入到集合最后面时(最后一个现有元素之后)时性能最好。随着集合规模的增大,数组复制的开销也迅速增加,因为每次插入操作必须复制的元素数量增加了。
只要不需要同步就用ArrayList,事实上ArrayList的存在基本上就是为了淘汰Vector,因为大多数情况下我们只是需要一个动态存储器,而不涉及同步问题。当然,考虑到有可能会有同步的需要以及像以前版本兼容Vector依然本保留下来。
作者:
遗忘的青春年华
时间:
2014-3-12 21:25
例如:
Vector<String> v = new Vector<>();
v.addElement("aaa");
v.addElement("bbb");
v.addElement("ccc");
v.addElement("ddd");
/*方式一:
Iterator<String> it = v.iterator();
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}*/
//方式二:Vector特有方法枚举
Enumeration<String> en =v.elements();
while(en.hasMoreElements()){
Object obj = en.nextElement();
System.out.println(obj);
}
同样是迭代,而Vector的特有方法枚举就比较繁琐,而且添加元素也比较繁琐, 主要是Vector线程同步,而ArrayList线程不同步.版本更新后ArrayList就把Vector代替了
作者:
mohuancaizi
时间:
2014-3-12 21:34
Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:
1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
3.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。
ArrayList中:
public boolean add(E e) {
ensureCapacity(size + 1); // 增加元素,判断是否能够容纳。不能的话就要新建数组
elementData[size++] = e;
return true;
}
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData; // 此行没看出来用处,不知道开发者出于什么考虑
int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的数组的大小
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
复制代码
Vector 中
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object[] oldData = elementData;
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
复制代码
关于ArrayList和Vector区别如下:
1.ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
2.Vector提供indexOf(obj, start)接口,ArrayList没有。
3.Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2