ArrayList为什么初始化的时候最好设置默认大小

  • Post author:
  • Post category:其他


看一下对比

  public static void main(String[] args) {
        //得到当前时间
        Long nowTime = System.currentTimeMillis();

        List<Integer> nosize = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            //默认不设置大小
            nosize.add(1);
        }

        System.out.println("初始化不指定指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");

        List<Integer> size = new ArrayList<>(1);
        nowTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            //初始化默认大小
            size.add(1);
        }
        System.out.println("初始化指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");

    }
结果:
初始化不指定指定大小用时时长141毫秒
初始化指定大小用时时长180毫秒
public static void main(String[] args) {
        //得到当前时间
        Long nowTime = System.currentTimeMillis();

        for (int i = 0; i < 10000000; i++) {
            List<Integer> nosize = new ArrayList<>();
            //默认不设置大小
            nosize.add(1);
        }

        System.out.println("初始化不指定指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");
        
        nowTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            List<Integer> size = new ArrayList<>(1);
            //初始化默认大小
            size.add(1);
        }
        System.out.println("初始化指定大小用时时长" + (System.currentTimeMillis() - nowTime) + "毫秒");

    }
结果:
初始化不指定指定大小用时时长142毫秒
初始化指定大小用时时长67毫秒

从上面可以看出扩容是比较费时间的

源码:

public boolean add(E e) {
//首先确定链表的大小,如果初始化不指定的话默认大小是10
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    
private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        //如果大于十会默认去除当前的位置
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }
    
private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // 如果内存不够会进行扩容!不经浪费时间还浪费内存
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
//如果大小不够的话要进行扩容进行扩容(最大是0x7fffffff=2147483647),否则孔融0x7fffffff-8,很浪费内存
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }



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