ArryList为什么无法自动扩容1.5倍?

我用默认方法创建一个ArrayList<>,视频里说默认长度是10,然后自动扩容到1.5倍,但是我用idea观察list长度,他并没有自动扩容,而是插入几笔数据长度就是几。

package com.pack1;

import com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput;

import java.util.ArrayList;
import java.util.List;

public class TestClass {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<Integer>();
        for(int i=0;i<20;i++){
            list.add(i);
            if(i==0){
                System.out.println("i==0");
            }
            if(i==9){
                System.out.println("i==9");
            }
            if(i==10){
                System.out.println("i==10");
            }
            if(i==11){
                System.out.println("i==11");
            }
            System.out.println("i=="+i);
        }
    }
}

当i=13,list长度是14,但是视频里说扩容是1.5倍,也就是list的index应该到14。不知道为什么,求高手解答!环境JDK1.8。idea2019.3.5。
补充:B站有视频,里面可以显示null的元素,而我这里不行。环境应该都差不多的。视频链接

阅读 1.8k
5 个回答

你的理解不到位。ArrayList实例在内部维护了一个Object数组,
Object[] elementData;
同时维护了一个元素数量size
private int size;

底层数组容量为elementData.length,而不是 size。
触发扩容时,会创建一个新的更大容量的数组,将elementData中的元素放入,再替换掉之前的elementData。

elementData = Arrys.copyOf(elementData, newLength)

而此时的size依然是元素数量。

直接看List的size肯定是14
扩容1.5倍的是ArrayList里面的数组

扩容是指 ArrayList 内部持有的那个数组(也即 elementData)的长度变了,又不是 ArrayList 本身的 size 变了,ArrayList 的 size 当然是你存几个元素它就是几了。

其实仔细理解的话你就会发现是个伪命题,如果扩容之后我的size也要跟着变大,那么实际装了14个元素,确实触发了扩容,但是我的size就是扩容的大小话,那么这个容器的api size 就很有大的歧义,以及失去了它意义,反而是个浪费空间的容器。

新手上路,请多包涵

size是指ArrayList的元素个数,不是容器的容量。其内部维护的数组你是无法访问到的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题