[2025.1.9 JavaSE学习]集合-2(List接口 && ArrayList)

List接口基本介绍

List接口是Collection接口的子接口

  • List集合类中元素有序(即添加顺序和取出顺序一致),且可重复
  • List集合每个元素都有其对应索引
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置

List三种便利方式

  • iterator
  • 增强for循环
  • 普通for循环

ArrayList注意事项

  • list.get()得到的是Object类型,如果需要调用子类的方法,需要向下转型
  • ArrayList可以加入null,并多个
  • ArrayList是由数组来实现数据存储的
  • ArrayList基本等同于Vector,除了ArrayList线程不安全(没有synchronized的修饰),但是执行效率高,多线程情况下,不推荐使用ArrayList

ArrayList底层结构和源码分析(重点)

  • ArrayList中维护了一个Object类型的数组elementData,transient:表示该属性不会被序列化
transient Object[ ] elementData;
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始化elementData容量为0,第1次添加,则扩容为10;如需要再次扩容,则扩容为1.5倍

  • 如果使用指定大小构造器,则初始化为指定大小;如果需要再次扩容,则直接扩容为1.5倍

  • 例子:无参构造器源码如下:

image

  • list.add方法如下:

image


ensureCapacityInternal方法如下,此处DEFAULT_CAPACITY = 10:

image

如果需要的容量大于实际需要的容量,则扩容(modCount:记录集合被修改的次数,多线程操作):

image

利用位移进行扩容,第1次newCapacity赋值为10,后面才真正开始1.5倍扩容:

image

posted @ 2025-01-10 02:02  Luna-Evelyn  阅读(49)  评论(0)    收藏  举报