ArrayList全面总结

  概述:ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capacity属性,表示它们所封装的Object[]数组的长度,当向ArrayList中添加元素时,该属性值会自动增加。如果想ArrayList中添加大量元素,可使用ensureCapacity方法一次性增加capacity,可以减少增加重分配的次数提高性能。ArrayList的用法和Vector向类似,但是Vector是一个较老的集合,具有很多缺点,不建议使用。另外,ArrayList和Vector的区别是:ArrayList是线程不安全的,当多条线程访问同一个ArrayList集合时,程序需要手动保证该集合的同步性,而Vector则是线程安全的。

  类的继承:ArrayList继承AbstractList抽象父类,实现了List接口(规定了List的操作规范)、RandomAccess(可随机访问)、Cloneable(可拷贝)、Serializable(可序列化)。

  类的属性:类的属性中核心的属性为elementData,类型为Object[],用于存放实际元素,并且被标记为transient,也就意味着在序列化的时候,此字段是不会被序列化的。

  类的构造函数1:指定elementData数组的大小,不允许初始化大小小于0,否则抛出异常。

  类的构造函数2:当未指定初始化大小时,会给elementData赋值为空集合。

  类的构造函数3:当传递的参数为集合类型时,会把集合类型转化为数组类型,并赋值给elementData。

  类的主要方法:

    add()源码分析:在add函数我们发现还有其他的函数ensureCapacityInternal,此函数可以理解为确保elementData数组有合适的大小。ensureCapacityInternal的具体函数如下

  在ensureCapacityInternal函数中我们又发现了ensureExplicitCapacity函数,这个函数也是为了确保elemenData数组有合适的大小。ensureExplicitCapacity的具体函数如下

  在ensureExplicitCapacity函数我们又发现了grow函数,grow函数才会对数组进行扩容,ensureCapacityInternal、ensureExplicitCapacity都只是过程,最后完成实际扩容操作还是得看grow函数,grow函数的具体函数如下 

    add()总结:正常情况下会扩容1.5倍,特殊情况下(新扩展数组大小已经达到了最大值)则只取最大值。调用过程:add-->ensureCapacityInternal-->ensureExplicitCapacity-->grow-->hugeCapacity (红色为可能执行)。经分析得到:尽量使用指定容量的数组,以达到节省内存空间的作用。

  类的其他方法:

    set(a) 设定指定下标索引的元素值。

    indexOf() 从头开始查找与指定元素相等的元素,注意,是可以查找null元素的,意味着ArrayList中可以存放null元素的。与此函数对应的lastIndexOf,表示从尾部开始查找。

    get() 会检查索引值是否合法(只检查是否大于size,而没有检查是否小于0),值得注意的是,在get函数中存在element函数,element函数用于返回具体的元素.返回的值都经过了向下转型(Object -> E)

    remove() remove函数用户移除指定下标的元素,此时会把指定下标到数组末尾的元素向前移动一个单位,并且会把数组最后一个元素设置为null,这样是为了方便之后将整个数组不被使用时,会被GC,可以作为小的技巧使用。

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-03-19 20:40  湖人总冠军forever  阅读(119)  评论(0编辑  收藏  举报

导航