说一说 ArrayList

特点
  • ArrayList 是容量可变的非线程安全列表,使用数组实现,集合扩容时会创建更大的数组,把原有数组复制到新数组。
// 新容量扩大到原容量的大约1.5倍,右移一位相当于原数值除以2,扩容并不是严格的1.5位
int newCapacity = oldCapacity + (oldCapacity >> 1);
  • 支持对元素的快速随机访问,但插入与删除速度很慢。
  • ArrayList 实现了 RandomAcess 标记接口,如果一个类实现了该接口,那么表示使用索引遍历比迭代器更快。
内部属性
  • 默认初始容量DEFAULT_CAPACITY = 10;

  • elementData是 ArrayList 的数据域(存储 ArrayList 元素的数组缓冲区),被 transient 修饰

  • 序列化时会调用 writeObject 写入流,反序列化时调用 readObject 重新赋值到新对象的 elementData。

  • 原因是 elementData 容量通常大于实际存储元素的数量,所以只需发送真正有实际值的数组元素。

  • size 是当前实际大小,elementData 大小大于等于 size。

  • modCount 记录了 ArrayList 结构性变化的次数,继承自 AbstractList。所有涉及结构变化的方法都会增加该值。

  • expectedModCount 是迭代器初始化时记录的 modCount 值,每次访问新元素时都会检查 modCount 和 expectedModCount 是否相等,不相等就会抛出异常。这种机制叫做 fail-fast,所有集合类都有这种机制。

  • 不能在foreach循环体中直接对集合进行add/remove操作,因为remove和add操作会导致modCount和迭代器中的expectedModCount不一致。

posted @ 2022-05-16 14:42  张三丰学Java  阅读(48)  评论(0编辑  收藏  举报