zoukankan      html  css  js  c++  java
  • Java中的Vector和ArrayList

    面试期间曾被问到,这里做个简单的总结。

    Vector和ArrayList都是List<E>接口的实现类,内部均通过数组实现,适合随机遍历查找,不适合中间插入和删除。

    通过Java的源码,可以窥视两者的不同。以add()方法为例:

    Vector:

    public synchronized boolean add(E e) {
        modCount++; // From AbstractList, count the Structural modifications
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
            return true;
        }
    
      /**
         * This implements the unsynchronized semantics of ensureCapacity.
         * Synchronized methods in this class can internally call this
         * method for ensuring capacity without incurring the cost of an
         * extra synchronization.
         *
         * @see #ensureCapacity(int)
         */
        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);
        }
        }

    ArrayList:

    public boolean add(E e) {
        ensureCapacity(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
        }
    
    public void ensureCapacity(int minCapacity) {
        modCount++;
        int oldCapacity = elementData.length;
        if (minCapacity > oldCapacity) {
            Object oldData[] = elementData;
            int newCapacity = (oldCapacity * 3)/2 + 1;
                if (newCapacity < minCapacity)
            newCapacity = minCapacity;
                // minCapacity is usually close to size, so this is a win:
                elementData = Arrays.copyOf(elementData, newCapacity);
        }
        }

    根据上述源码可知:

    1. Vector是线程安全,而ArrayList不是。所以在非多线程环境,应该选择ArrayList,避免线程安全的系统开销

    2. 当存储空间不够的时候,Vector扩展一倍(oldCapacity*2),而ArrayList扩展一半+1个((oldCapacity * 3)/2 + 1)。

  • 相关阅读:
    Python学习笔记
    AC自动机跟随Kuangbing学习笔记
    【后缀数组】【poj2774】【 Long Long Message】
    【思路题】【多校第一场】【1001.OO’s Sequence】
    【求出所有最短路+最小割】【多校第一场】【G题】
    【后缀数组学习中】
    【关于字符串要补的题】
    49.运维6-ansible
    48.python&&django时区转化
    47.python脚本自定义token验证
  • 原文地址:https://www.cnblogs.com/techyc/p/2956173.html
Copyright © 2011-2022 走看看