美文网首页
ArrayList源码小解

ArrayList源码小解

作者: SnailWalker | 来源:发表于2020-03-02 20:14 被阅读0次

1.接口

  • 1.RandomAccess
  • 2.Cloneable
  • 3.Serializable
  • 4.List

2.成员变量

  • 1.默认容量 10
  • 2.二个空数组Object[] ={}
  • 3.一个实际用于存储的Object[]对象 : 被transient修饰
  • 4.存储在Object[]中的对象个数
    1. 最大数组大小 Integer.MAX_VALUE-8
    1. 操作计数器: modeCount 被transient修饰

3.方法

  • 1.构造函数

    • 1.ArrayList(): 默认初始化一个空的 Object[]
    • 2.ArrayList(int):
    • 3.ArrayList(Collection)
  • 2.add()

      1. 申请 minCapacity=size+1 容量,如果当前elementData就是默认的空数组,那么minCapacity=Math.max(10,minCapacity),如果请求的容量比当前容量要大,那么久需要扩容
    • 2.扩容一轮: newCapacity=Math.max(申请的容量,原容量扩大0.5倍)
    • 3.扩容二轮: 2中确定的容量,进一步比对Integer.MAX_VALUE-8,如果大于这个数值,扩容容量采取满足需要前提下最小容量原则,在 Integer.MAX_VALUEInteger.MAX_VALUE-8中选择一个
      1. 将原来容器中的数据copy到扩容后的新容器中
  • 3.remove()

    • 1.将要删除的元素后面元素向前缩进一位,然后将最后一位置空

5.拓展

  • 1.Iterator < Itr < ListItr 与 modeCount
    • 1.并发修改异常: modeCount和expectedModCount不一致引起
    • 2.Itr 支持动态删除的操作,ListItr支持动态增删改操作
  • 2.自动扩容 (见#3-2)
    1. 使用transient修饰elementData对象:
      1. 减小序列化后数据的大小: 如果elementData占10个位置,但是只存储了4个对象,通过重写readObject(),writeObject()方法,只序列化这4个对象
  • 4.小优化点
    • 1.遍历: fori的优于foreach

相关文章

网友评论

      本文标题:ArrayList源码小解

      本文链接:https://www.haomeiwen.com/subject/xegbkhtx.html