zoukankan      html  css  js  c++  java
  • Java 集合:(九) ArrayList 与 Vector 异同

    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倍。随后将数组元素拷贝到新数组,如果这个动作频繁执行的话,会增大性能开销。

     

  • 相关阅读:
    带不带protype的区别
    一些方法(自己的认知)
    事件
    简单笔记
    freemarker Velocity获取request,session
    Freemaker中使用中括号来包含标签
    FreeMarker自定义标签
    Velocity模版自定义标签
    前端常用代码
    Eclipse中配置Ehcache提示信息
  • 原文地址:https://www.cnblogs.com/niujifei/p/14675843.html
Copyright © 2011-2022 走看看