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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jing迪 高级黑马   /  2013-12-16 22:17  /  1255 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Vector 和 ArrayList的区别

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

7 个回复

倒序浏览
同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList 是线程序不安全的,不是 同步的

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 还漏了一个特性呢~嘻嘻~~

查看全部评分

回复 使用道具 举报
FFF 金牌黑马 2013-12-16 22:30:37
藤椅
主要有两个方面的不同:
1.同步性:ArrayList是不同步的。Vector是同步的。当不需要同步时,使用ArrayList可以节约一些不必要的系统资源。
2.数组的自增长:ArrayList是在原数据的基础上增加50%、Vector则是在原基础上增加100%。

其他方面两者基本一致。
PS:ArrayList是Vector的替代品。
PPS:个人建议不管同不同步使用ArrayList更好一些。
回复 使用道具 举报
FFF 发表于 2013-12-16 22:30
主要有两个方面的不同:
1.同步性:ArrayList是不同步的。Vector是同步的。当不需要同步时,使用ArrayList ...

嘿嘿。。。多多指教
回复 使用道具 举报
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:
1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
3.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

     查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。
ArrayList中:
  1. public boolean add(E e) {

  2.     ensureCapacity(size + 1);  // 增加元素,判断是否能够容纳。不能的话就要新建数组

  3.     elementData[size++] = e;

  4.     return true;

  5. }

  6. public void ensureCapacity(int minCapacity) {

  7.     modCount++;

  8.     int oldCapacity = elementData.length;

  9.     if (minCapacity > oldCapacity) {

  10.         Object oldData[] = elementData; // 此行没看出来用处,不知道开发者出于什么考虑

  11.         int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的数组的大小

  12.         if (newCapacity < minCapacity)

  13.        newCapacity = minCapacity;

  14.             // minCapacity is usually close to size, so this is a win:

  15.             elementData = Arrays.copyOf(elementData, newCapacity);

  16.     }

  17. }
复制代码

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);

    }

}
最后再次总结一下
1.ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
2.Vector提供indexOf(obj, start)接口,ArrayList没有。
3.Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 同学,其实,你只需要最后那三句就可以了!.

查看全部评分

回复 使用道具 举报
ArrayList是线程不安全的,Vector是线程安全的,这个大家都知道。
因为Vector是线程安全的,所有在Vector当中的所有方法也都是线程安全的,所有在使用它的
时候非常占用空间,会导致效率降低25%左右。在以前我们需要使用多线程的时候我们一般情况下使用它,但是在现在jdk1.2版本上的使用Collections.sychronizedList(list)返回一个线程安全的List,请查API中的Collections类
其他地方,两者都是相同的。
interface可以看成是一个插件,功能是增加一些类的功能。
this指的是当前。功能一是在出现多个相同名字的对象引用或者数据时,可以使用它指定我使用当前最近的需要的一个对象引用或者数据。功能二指定当前相同重载方法的一种直接引用。
以上是我个人理解。谢谢
回复 使用道具 举报
wowo6288 发表于 2013-12-16 22:39
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用 ...

嗯也可以,下次就以浓缩为精华嘿嘿
回复 使用道具 举报
李然 中级黑马 2013-12-17 22:25:46
8#
基本可以理解成一个东西,在jdk1.0的时候只有Vector,在1.2以后有了collection体系之后就用ArrayList替代了Vector,对于线程安全问题,因为还是ArrayList速度比较快,所以我们可以用ArrayList再另加锁的方法替代Vector,还有一点,如果取枚举的话只有Vector,但是枚举在升级版本的过程中也被迭代器替代了。
总之就是,现在ArrayList可以完全替代Vector了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马