ArrayList 与 Vector 异同

一、相同点

  1、底层结构相同

    (1)ArrayList 是 List 的主要实现类,底层使⽤ Object[ ]存储,适⽤于频繁的查找⼯作;

    (2)Vector 是 List 的古⽼实现类,底层使⽤ Object[ ]存储。

  2、常用操作相同

    底层基于动态数组实现的,对于增删改查,遍历等操作都相似,适用于频繁的查找工作。

二、不同点

  1、线程安全

    ArrayList是非线程安全,而Vector是线程安全的,那么表现在源码上是怎么样的区别呢?就是在每个ArrayList的方法前,加上synchronized。

    ArrayList 是线程不安全的,Vector 是线程安全的。

    测试代码:

 1 public static void ArrayListVectorTest(){
 2     final List<Integer> list =newArrayList<Integer>(11);
 3     final Vector<Integer> vector =newVector<>();
 4     Runnable listrun =newRunnable(){
 5         @Override
 6         public void run(){
 7             for(int i =0; i<5; i++){
 8                 list.add(i);
 9                 System.out.println("list size = "+list.size());
10             }
11         }
12     };
13     Runnable vectorrun =newRunnable(){
14         @Override
15         public void run(){
16             for(int i =0; i<5; i++){
17                 vector.add(i);
18                 System.out.println("vectorrun size = "+vector.size());
19             }
20         }
21     };
22     newThread(listrun).start();
23     newThread(listrun).start();
24     newThread(listrun).start();
25     newThread(vectorrun).start();
26     newThread(vectorrun).start();
27     newThread(vectorrun).start();
28 }

 

    运行结果:

 1 list size =2
 2 list size =2
 3 list size =2
 4 list size =5
 5 list size =4
 6 list size =7
 7 list size =8
 8 list size =9
 9 list size =3
10 list size =10
11 list size =11
12 list size =12
13 list size =6
14 list size =13
15 list size =14
16 ArrayList的测试结果:理论上最终的size应该等于15,但是他却是14,说明ArrayList不是线程安全的
17 vectorrun size =3
18 vectorrun size =3
19 vectorrun size =3
20 vectorrun size =5
21 vectorrun size =7
22 vectorrun size =8
23 vectorrun size =9
24 vectorrun size =4
25 vectorrun size =6
26 vectorrun size =10
27 vectorrun size =11
28 vectorrun size =12
29 vectorrun size =13
30 vectorrun size =14
31 vectorrun size =15
32 Vector的测试结果:和理论上的结果一样,size等于15,可以证明Vector是线程安全的

 

  2、性能

    由于 ArrayList 是线程不安全的,性能相对来说比较高;

    Vector 是线程安全的,由于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。

    所以在不需要考虑多线程的环境下,建议使用ArrayList

  3、扩容方式

    (1)Vector每次扩容请求其大小的2倍空间;Vector还有一个子类Stack。
        Vector中有一个capacityIncrement变量,每次扩容都在原来大小基础上增加capacityIncrement。如果capacityIncrement==0,那么就在原大小基础上再扩充一倍。
      Vector中有一个方法setSize(int newSize),而ArrayList并没有,感觉得这个方法有点鸡肋。setSize允许用户主动设置容器大小,如果newSize小于当前size,那么elementData数组中只会保留newSize个元素,多出来的会设为null。如果newSize大于当前size,那么就扩容到newSize大小,数组中多出来的部分设为null,以后添加元素的时候,之前多出来的部分就会以null的形式存在
    (2)ArrayList扩容后是原来的1.5倍空间。
 
      使用建议:创建一个ArrayList实例的时候,最好考虑一下业务场景,如果我们将频繁的存储大量的元素,那么最好在创建的时候指定一个合理的size。所谓动态扩容,就是当数组中存储的元素达到容量上限以后,ArrayList会创建一个新的数组,新数组的大小为当前数组大小的1.5倍。随后将数组元素拷贝到新数组,如果这个动作频繁执行的话,会增大性能开销。

 

 

 

posted on 2021-04-19 10:39  格物致知_Tony  阅读(141)  评论(0编辑  收藏  举报