zoukankan      html  css  js  c++  java
  • ArrayList和Vector区别

    java基础之ArrayList和Vector的主要区别;

    List接口下一共实现了三个类:ArrayList,Vector,LinkedList。
    LinkedList主要保持数据的插入顺序的时候使用,采用链表结构。

    ArrayList,Vector主要区别为以下几点:
    (1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;
    (2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;
    (3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。

    源码分析:
    首先看看构造器:
    ArrayList:三个

      /**
         * Constructs an empty list with an initial capacity of ten.
         * 构造一个默认初始容量为10的list 
         */
        public ArrayList() {
            super();
            this.elementData = EMPTY_ELEMENTDATA;
        }
    
        /**
         * 构造一个指定默认长度的list initialCapacity 不能小于0;
         * Constructs an empty list with the specified initial capacity.
         *
         * @param  initialCapacity  the initial capacity of the list
         * @throws IllegalArgumentException if the specified initial capacity
         *         is negative
         */
        public ArrayList(int initialCapacity) {
            super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            this.elementData = new Object[initialCapacity];
        }
    
    
    
    
     /**  构造一个包含collection 元素的list
         * Constructs a list containing the elements of the specified
         * collection, in the order they are returned by the collection's
         * iterator.
         *
         * @param c the collection whose elements are to be placed into this list
         * @throws NullPointerException if the specified collection is null
         */
        public ArrayList(Collection<? extends E> c) {
          ...
        }

    Vector:四个

    //构造一个指定默认长度的list
      public Vector(int initialCapacity) {
            this(initialCapacity, 0);
        }
     //构造一个默认初始容量为10的list 
      public Vector() {
            this(10);
        }
      //构造一个包含collection 元素的list
      public Vector(Collection<? extends E> c) {
            ...
        }
    //区别在于可以设置capacityIncrement
     public Vector(int initialCapacity, int capacityIncrement) {
            super();
           ...
        }

    vector多了一个public Vector(int initialCapacity, int capacityIncrement)构造器,可以设置容量增长,arraylist是没有的。

    主要添加源码分析

    ArrayList类:

        public boolean add(E e) {  
            ensureCapacityInternal(size + 1);  // Increments modCount!!  
            elementData[size++] = e;  
            return true;  
        }  
    
        private void ensureCapacityInternal(int minCapacity) {  
            modCount++;  
            // overflow-conscious code  
    
            //如果添加一个元素之后,新容器的大小大于容器的容量,那么就无法存值了,需要扩充空间  
            if (minCapacity - elementData.length > 0)  
    
                grow(minCapacity);  
        }  
    
        private void grow(int minCapacity) {  
            // overflow-conscious code  
            int oldCapacity = elementData.length;  
            int newCapacity = oldCapacity + (oldCapacity >> 1); //扩充的空间增加原来的50%(即是原来的1.5倍)  
            if (newCapacity - minCapacity < 0) //如果容器扩容之后还是不够,那么干脆直接将minCapacity设为容器的大小  
                newCapacity = minCapacity;  
            if (newCapacity - MAX_ARRAY_SIZE > 0) //如果扩充的容器太大了的话,那么就执行hugeCapacity  
                newCapacity = hugeCapacity(minCapacity);  
            // minCapacity is usually close to size, so this is a win:  
            elementData = Arrays.copyOf(elementData, newCapacity);  
        } 

    Vector类:

         public synchronized boolean add(E e) {  
             modCount++;  
             ensureCapacityHelper(elementCount + 1);  
             elementData[elementCount++] = e;  
             return true;  
         }  
    
         private void ensureCapacityHelper(int minCapacity) {  
             // overflow-conscious code  
             if (minCapacity - elementData.length > 0)  
                 grow(minCapacity);  
         }  
    
         private void grow(int minCapacity) {  
             // overflow-conscious code  
             int oldCapacity = elementData.length;  
             int newCapacity = oldCapacity + ((capacityIncrement > 0) ?  
                                              capacityIncrement : oldCapacity);  
    
             /** 
    
             这个扩容需要做个判断:如果容量增量初始化的不是0,即使用的public Vector(int initialCapacity,int capacityIncrement) 
    
             构造方法进行的初始化,那么扩容的容量是(oldCapacity+capacityIncrement),就是原来的容量加上容量增量的值; 
    
             如果没有设置容量增量,那么扩容后的容量就是(oldCapacity+oldCapacity),就是原来容量的二倍。 
    
             **/  
    
             if (newCapacity - minCapacity < 0)  
                 newCapacity = minCapacity;  
             if (newCapacity - MAX_ARRAY_SIZE > 0)  
                 newCapacity = hugeCapacity(minCapacity);  
             elementData = Arrays.copyOf(elementData, newCapacity);  
         }

    注:转载自:blog.csdn.net/ldxlz224/article/details/52574821

  • 相关阅读:
    DICOM:DICOM3.0网络通信协议
    Maven使用—拷贝Maven依赖jar包到指定目录
    Spring Boot使用JavaMailSender发送邮件
    SpringBoot配置Email发送功能
    MariaDB 安装与启动 过程记录
    ESXi与Linux主机配置syslog日志上传远程服务器
    Linux--忘记MySQL密码的解决方法和输入mysqld_safe --skip-grant-tables &后无法进入MySQL的解决方法
    centos killall安装
    centos安装lspci工具
    oracle创建job和删除job
  • 原文地址:https://www.cnblogs.com/864466244qq/p/8556301.html
Copyright © 2011-2022 走看看