ArrayList和Vector源代码中的区别

集合类提供了add, remove, replace, get, set等方法,这些就相当于你天天写的增删改查,add -> 增,remove -> 删,replace -> 改,get -> 查,你看是不是对得上,这就是写代码day day up的诀窍,哈哈哈!

Vector和ArrayList的区别

相同点:

1. 都实现了List接口,属于Java集合框架的内容。

 

2. 都是用对象数组来存储数据的,元素初始个数默认都是10个

 

不同点:

1. Java版本不一样

Vector从JDK1.0就已经有了,比ArrayList和List都还要早,

ArrayList、LinkedList和List、Collection都是从1.2才开始有的,说明什么?

说明Vector是这当中最古老的存在了,从1.2才实现了List接口

Java底层是用C++写的,Vector类应该是参考自C++,因为C++中也有一个Vector

 

2. Vector数组元素默认扩容1倍,ArrayList只能扩容0.5倍

Vector:

这里Vector中的capacityIncrement(扩容个数)是可以指定的,如果指定了扩容个数,就以你指定的为准。

 

ArrayList:

 

3. Vector线程安全(?),ArrayList线程不安全

为什么Vector是线程安全?加锁了!Vector的大部分方法都加了synchronized修饰符,类似如下这样:

 

但有一点必须注意:Vector单个方法使用起来是线程安全的,但是两个方法复合使用就容易引发出get-if-not-empty这样的问题

if (vector.size() > 0) {

    System.out.println(vector.get(0));

}

因为size和get方法是加锁的,如果有两个线程同时执行,存在锁竞争的情况。

线程T1可能把 size 给改变了,假设原来是1变成了0。但线程T2在线程T1改变之前,已经进入到 if内部了,这样的情况T2就很有可能会出现不正确的结果或者异常。

所以正确的做法应该是这样:

synchronized (vector) {

    if (vector.size() > 0) {

        System.out.println(vector.get(0));

    }

}

但如果这样,和使用ArrayList的效果是一样的。Vector的线程安全就显得很尴尬,很鸡肋了!本身Vector的方法就加了互斥锁,执行性能较差,所以不推荐使用Vector!!!

ArrayList没有Synchronized修饰符的加持,所以多线程中确实是会有问题的。但我们实际应用过程中更多的使用场景是单线程的情况。如果是多线程场景,手动加上Synchronized不就OK了。


版权声明:本文为lovewinner512原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。