ArrayList源码分析--jdk1.8
LinkedList源码分析--jdk1.8
HashMap源码分析--jdk1.8
AQS源码分析--jdk1.8
ReentrantLock源码分析--jdk1.8
1. ArrayList是可以动态扩容和动态删除冗余容量的索引序列,基于数组实现的集合。 2. ArrayList支持随机访问、克隆、序列化,元素有序且可以重复。 3. ArrayList初始默认长度10,超出扩容1.5倍,使用Object[]存储各种数据类型。
数据结构是集合的精华所在,数据结构往往也限制了集合的作用和侧重点,了解各种数据结构是我们分析源码的必经之路。 ArrayList的数据结构如下:![]()
ArrayList源码分析--jdk1.8JDK1.8ArrayList概述ArrayList数据结构ArrayList源码分析ArrayList总结
ArrayList extends AbstractList AbstractList extends AbstractCollection java中所有类都继承Object,所以ArrayList的继承结构如上图。 1. AbstractList是一个抽象类,实现了List<E>接口,List<E>定义了一些List通用方法,而AbstractList抽象类中可以有抽象方法,还可以有具体的实现方法,AbstractList实现接口中一些通用的方法,实现了基础的add/get/indexOf/iterator/subList/RandomAccessSubList方法,ArrayList再继承AbstractList,拿到通用基础的方法,然后自己在实现一些自己特有的方法,这样的好处是:让代码更简洁,继承结构最底层的类中通用的方法,减少重复代码。 2.ArrayList实现了List<E>、RandomAccess、Cloneable、Serializable接口 1)List<E>接口,ArrayList既然继承自AbstractList抽象类,而AbstractList已 经实现了List接口,那么ArrayList类为何还要再实现List接口呢?我们带着疑问往下看:![]()
ArrayList源码分析--jdk1.8JDK1.8ArrayList概述ArrayList数据结构ArrayList源码分析ArrayList总结
可以看出这样这样设计是有道理的,因此,这并不是一个错误,很可能是作者Josh Bloch为了便于实现代理而精心设计的。 参考与:开发collection 的作者Josh说 2)RandomAccess接口,这是一个标记接口,一般此标记接口用于 List 实现,以表明它们支持快速(通常是恒定时间)的随机访问,该接口的主要目的是允许通用算法改变其行为,以便在应用于随机或顺序访问列表时提供良好的性能,实现了该接口的话使用普通的for循环来遍历,性能更高,而没有实现该接口的话,使用Iterator来迭代,这样性能更高,例如linkedList。所以这个标记性只是为了让我们知道我们用什么样的方式去获取数据性能更好 3)Cloneable接口,可以使用Object.Clone()方法。 4)Serializable接口,序列化接口,表明该类可以被序列化,什么是序列化?简单的说,就是能够从类变成字节流传输,反序列化,就是从字节流变成原来的类
1)add(E);//默认直接在末尾添加元素
2)add(int index, E element);//给指定下标,添加元素
3)addAll(Collection<? extends E> c);//添加Collection类型元素
4)addAll(int index, Collection<? extends E> c);//指定位置,添加Collection类型元素
总结:
正常情况下会扩容1.5倍,特殊情况下(新扩展数组大小已经达到了最大值)则只取最大值。
1)remove(int index); //根据指定下标 删除元素
2)remove(Object o); //根据指定元素 删除元素
3)removeAll(Collection<?> c); //删除包含在指定容器c中的所有元素
4)removeIf(Predicate<? super E> filter); //按照一定规则过滤(删除)集合中的元素
remove函数用户移除指定下标的元素,此时会把指定下标到数组末尾的元素向前移动一个单位,并且会把数组最后一个元素设置为null,这样是为了方便之后将整个数组不被使用时,会被GC,可以作为小的技巧使用。