4-ArrayList

ArrayList实现类(JDK1.7)

       //接口=实现类--->为了扩展性这样做--->因为可以Collection col = new LinkedList();
       Collection col = new ArrayList();
       List list = new ArrayList();
       //直接创建实现类对象
       ArrayList al = new ArrayList();
       /*
       ArrayList:
       底层的数组elementData--->数组类型:Object类型
       size:数组中的有效数据

       在JDK1.7中:在调用构造器的时候给底层数组elementData初始化,数组的初始化长度为10
        */

       al.add("abc");
       al.add("def");
  • 内存分析:

  • 调用add方法

扩容

  • size=10------>ArrayList底层会走grow(minCapacity)方法进行扩容
    1. 当数组中的10个位置都满了的时候就开始进行数组的扩容,扩容长度为原数组的1.5倍
    2. grow方法-->创建新数组--->长度为1.5倍
    3. 将原数组的内容复制到新数组中
    4. 将elementData指向新数组实现扩容
  1. 内存分析:

ArrayList(JDK1.8)

  • JDK1.8底层依旧是Object类型的数组,size是有效长度

  • ArrayList al = new ArrayList();---->调用构造器-->初始化为空{}的数组(而不是像1.7长度为10的数组)

  • 调用add方法(第一次调用add方法时,底层数组长度才变为10)

  • 扩容时候是一样的(size+1=11时---->扩容1.5倍)

总结

  • JDK1.7:底层数组,在调用构造器的时候,数组长度初始化为10,扩容的时候扩容为原数组的1.5倍
  • JDK1.8:底层数组,在调用构造器的时候,底层数组为{},在调用add方法以后底层数组才重新赋值为新数组,新数组的长度为10---->节省了内存,在add后才创建长度为10的数组
posted @ 2024-08-12 22:56  呆头尖瓜  阅读(4)  评论(0编辑  收藏  举报