A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周星星 注册黑马   /  2012-6-19 09:20  /  2886 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有事一道笔试题,我已经参加了近5家公司的笔试题。他们的共同特点是:重视java基础

12 个回复

正序浏览
Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。

二者最大的区别是 vector是线程安全的,是同步的,性能较差;ArrayList是线程不安全的,是异步的,性能较高。
举例说明:
当创建一个Vector对象时候,
Vector ve=new Vector();
ve.add("1");
当在多线程程序中,第一个线程调用修改对象ve的时候,就为其上了锁,其他线程只有等待。
当创建一个ArrayList对象时候,
ArrayList list=new ArrayList();
list.add("1");
当在多线程程序中,第一个线程调用修改对象list的时候,没有为其上锁,其他线程访问时就会报错。
eg:list.remove("1"),然后再由其他线程访问list对象的1时就会报错。

Vector在增加一个元素的时候用定长的方法增加。
而ArrayList则是以你增加元素的大小来增加。
vector与arraylist
回复 使用道具 举报
首先说说共同点:它们二者底层都是数组结构...
区别: Vector是线程安全的,所以效率较低..
        ArrayList是线程不安全的,因为有角标所以所以查询速率很快....
        还有他们底层都是一个初始长度为10的数组,Vector在长度不够用的时候继续新建一个长度是原来1倍的的数组,
        而ArrayList初始长度也是为10的数组,而在长度不够的情况下新建一个原来0.5倍的数组,所以比较省空间..
回复 使用道具 举报
whocases 黑马帝 2012-6-19 17:51:47
11#
Vector增长原来的一倍,ArrayList增加原来的0.5倍
回复 使用道具 举报
whocases 黑马帝 2012-6-19 17:51:18
10#
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。
回复 使用道具 举报
杨康 中级黑马 2012-6-19 17:40:46
9#
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快.

回复 使用道具 举报
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储
在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置
索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不
同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本
来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对
比方式,更有利于说明问题)。
接着才说ArrayList与Vector的区别,这主要包括两个方面:.
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序
不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用
ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是
使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector
与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap
是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。
(2)数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了
容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加
一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序
效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档
中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置
初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。



回复 使用道具 举报
ArrayList   数组实现,10,增长0.5,查询快,操作慢

Vector      就是线程安全的ArrayList
                它特有的几个方法:addElement()  elementAt()  elements()
回复 使用道具 举报
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也为每个插入的元素建立一个内部对象。所以,你也必须知道,同时产生了垃圾对象。
回复 使用道具 举报
二者一个区别是版本问题,Vector从Java 1.0起就存在,ArrayList从Java 1.2起才存在,较新.另外,ArrayList不具备线程同步的安全性,但速度较快;Vector由于是同步的,所以比较安全,如果是要用在对线程安全不高的环境下还是尽可能用arraylist或linkedlist比较好,性能稍高,如果要用在线程要求很高的环境下还是用vector比较好
回复 使用道具 举报
Vector和ArrayList Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。
  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
  当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间

ArrayList底层是数组数据结构,并且它的查询速度快,增删速度稍微慢点。

稍微提一嘴:LinkedList:底层是链表数据结构,查询速度稍微慢点,增删速度快。

Vector从Java 1.0起就存在,ArrayList从Java 1.2起才存在,较新。
所以ArrayList取代了Vector。
回复 使用道具 举报
Vector是JDK1.0出现的,线程同步,取数方式是用枚举:Enumeration<String> strings=new Vector<String>().elements();
因为线程同步效率低,所以出现了ArrayList,线程不同步,取数方式是迭代器: Iterator<String>iterator =new ArrayList<String>().iterator();
回复 使用道具 举报
ArrayList实现的时候不是同步的,而Vector是同步的,1.2版本之后,Vector改进为可以使实现List接口,如果你要让ArratList实现同步的话,可以自己加lock;
ArrayList和Vector 类都是可以实现可增长的对象数组,ArrayList增长长度为原来的一半,Vector增长长度为原长度的一倍;
所以ArrayList更加节省内存空间;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马