ArrayList是Java集合类中一个非常重要的实现类,低层实现为数组,在随机存储方面性能很高,但是在增删数据方面性能一般。平常使用的很多,但是还没有系统的取读取其源码。
继承关系
|
|
ArrayLis继承了AbstractList抽象类
ArrayList实现了List接口,RandomAccess接口,Cloneable接口和Serializable接口。
List接口:一开始以为List接口都是很熟悉的东西,结果注释了下源码,发现还是有很多新加的特性,比如可分割迭代器这种,从来没有用过,不过今天的重点不在这里。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576public interface List<E> extends Collection<E> {//返回列表的长度int size();//列表是否为空boolean isEmpty();//列表中是否包含某个元素boolean contains(Object o);//获取列表的迭代器Iterator<E> iterator();//将列表转换成一个Object数组Object[] toArray();//将列表转换成任意类型的数组<T> T[] toArray(T[] a);//向列表中添加元素eboolean add(E e);//从列表中移除元素oboolean remove(Object o);//看列表中是否包含另一个集合的全部元素boolean containsAll(Collection<?> c);//将一个集合加入到列表中boolean addAll(Collection<? extends E> c);//将一个集合在指定位置加入到列表中boolean addAll(int index, Collection<? extends E> c);//将列表中属于另一个集合的元素都移除boolean removeAll(Collection<?> c);//移除所有不在另一个集合中的元素,取交集boolean retainAll(Collection<?> c);//对所有元素进行统一操作default void replaceAll(UnaryOperator<E> operator) {Objects.requireNonNull(operator);final ListIterator<E> li = this.listIterator();while (li.hasNext()) {li.set(operator.apply(li.next()));}}//根据给定的比较器对列表进行排序@SuppressWarnings({"unchecked", "rawtypes"})default void sort(Comparator<? super E> c) {Object[] a = this.toArray();Arrays.sort(a, (Comparator) c);ListIterator<E> i = this.listIterator();for (Object e : a) {i.next();i.set((E) e);}}//清空列表void clear();// 判断两个列表是否相等boolean equals(Object o);//返回列表的哈希值int hashCode();//获取index位置的元素E get(int index);//将index位置元素的值设定为elementE set(int index, E element);//在指定位置添加元素void add(int index, E element);//移除index位置的元素E remove(int index);//元素o的最靠前的下标int indexOf(Object o);//元素o最靠后的下标int lastIndexOf(Object o);//返回迭代器列表ListIterator<E> listIterator();//返回指定位置之后的迭代器列表ListIterator<E> listIterator(int index);//返回字列表List<E> subList(int fromIndex, int toIndex);//返回并行迭代器列表@Overridedefault Spliterator<E> spliterator() {return Spliterators.spliterator(this, Spliterator.ORDERED);}}RandomAccess接口:是一个空的接口,目的是为了标明实现该接口的List是否支持随机访问,支持的话访问会更加高效。Java中有很多空接口是为了起到标记的作用,看ArrayList源码时需要注意这一点的作用。
12public interface RandomAccess {}Cloneable接口:目的是为了表明实现了该接口的对象可以调用clone方法来实现对象的复制,设计模式中原型模式就是用的这个特性,该特性jdk1.0就已经支持了,可以说很Java了。
12public interface Cloneable {}Serializable接口:序列化接口是为了标记一个对象的状态是否能序列化到文件,提供了一种内存中对象的保存和加载机制,也是个标记接口。
12public interface Serializable {}
可以看出,ArrayList除了三个标记接口外,最重要的还是List接口方法的实现。
成员变量
|
|
构造方法
总结来说,ArrayList的构造方法有啥三个,默认长度的,指定长度的,根据集合类生成的。
|
|
trimToSize()方法
该方法是将ArrayList的容量设置为当前size的大小。目的是为了缩减ArrayList的存储空间,ArrayList的容量为开辟的数组长度,size为存进去的元素个数。当我们只需要对ArrayList做查询操作,而不需要进行新增操作,则可以trim节省内存空间。
|
|
JDK源码里面三元表达式用的比较多,if判断用的比较少,以后需要多使用三元表达式,很简洁直观。
size()方法
|
|
isEmpty()方法
|
|
contains(Object o)方法
|
|
indexOf(Object o) 方法
|
|
lastIndexOf(Object o) 方法
|
|
clone()方法
|
|
toArray()方法
|
|
toArray(T[] a)方法
|
|
get(int index)方法
|
|
set(int index, E element)方法
|
|
add(E e)方法
|
|
add之前,首先需要检查是否存在数组越界的问题,这个由ensureCapacityInternal来确保,如果发生了越界则进行扩容。
|
|
add(int index, E element)方法
|
|
remove(int index)方法
|
|
remove(Object o)方法
|
|
clear()方法
|
|
addAll(Collection<? extends E> c)方法
|
|
addAll(int index, Collection<? extends E> c)方法
|
|
removeAll(Collection<?> c)
|
|
retainAll(Collection<?> c) 方法
|
|
序列化与反序列化
|
|
listIterator(int index)方法
这部分内容没有仔细去看,暂不注解,后面会进行完善。
|
|
subList(int fromIndex, int toIndex)方法
|
|
forEach(Consumer<? super E> action)方法
|
|
Sort方法
|
|