您的位置:首页 > 职场人生

ArrayList面试题

2021-02-23 00:59 776 查看

ArrayList结构

ArrayList

ArrayList继承自AbstractList抽象类,是顺序容器,即元素存储的顺序和放入的顺序一致。允许放入null元素,底层实现为Object类型数组。

扩容过程

使用默认构造函数创建ArrayList时,ArrayList中的元素数组大小默认为0.在第一次放入元素时,会进行扩容操作,将其容量扩大到10.
综上所述,ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。
每次向容器中添加元素,都会先计算添加完元素的大小是否超出了容量,如果超出则容器会自动扩容底层Object数组的大小。
具体操作流程如下:

  1. 先判断数组是不是默认的空数组,如果是则将容量置为10.
  2. 如果数组的预期实际容量超过容量,则将容量扩充至原数组容量*1.5。如果发现原容量*1.5也小于数组的预期实际容量,则将预期实际容量作为数组的容量 举个例子,如果数组容量为10,且其中只有1个元素,此时我们使用addAll方法向其中添加20个元素,预期实际容量为21,会先将数组的容量变为10*1.5=15,发现15<21后,会将21作为数组的容量
  • 以新的容量作为数组容量,创建一个原数组的副本,副本数组的大小为新容量。并将数组引用指向这个新数组。接着将新的元素添加到该数组指定位置之后。更新数组size(实际含有元素多少)
  • 快速失败fast-fail机制

    一、快速失败(fail—fast)
    在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 Concurrent Modification Exception。

    原理:集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。而迭代器在初始化时,会将当时集合的modCount作为自己的modCount。迭代器在遍历时直接访问集合中的内容,并且在遍历过程中会校验modCount的值是否发生变化,会检测 modCount 变量是否为 expectedmodCount 值,是的话就返回遍历;否则抛出异常,终止遍历。
    但及时如此也不能使用该机制保证ArrayList的线程安全,如果集合发生变化时修改 modCount 值刚好又设置为了 expectedmodCount 值,则异常不会抛出。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: