List

public interface List<E> extends Collection<public interface List<E> extends Collection<E>

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

与 set 不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足 e1.equals(e2) 的元素对 e1e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。难免有人希望通过在用户尝试插入重复元素时抛出运行时异常的方法来禁止重复的列表,但我们希望这种用法越少越好。

ArrayList

1.默认构造函数:构造一个空的列表,初始容量为10.但是没有马上就创建容量为10的,直到add方法时才会构造。

2.Arrays.copyof(原数组,新的长度)

public static <T> T[] copyOf(T[] original, public static <T> T[] copyOf(T[] original, int newLength)

内部new了一个新的数组,并调用System.copy完成拷贝,返回新的数组的引用

3.add(E e)方法

  • 插入之前会先检查容量是否足够minCpacity=size + 1, 看size + 1 是否比elementData.length 要大,

    是的话,进行扩容,否则直接插入

  • 扩容之前modCount++, 指修改集合的次数

  • add的本质就是数组赋值

  • 扩容是调用Arrays.copyof完成

4.成员变量EMPTY_ELEMENTDATADEFAULTCAPACITY_EMPTY_ELEMENTDATA

/**
    * Shared empty array instance used for empty instances.
    */
   private static final Object[] EMPTY_ELEMENTDATA = {};

   /**
    * Shared empty array instance used for default sized empty instances. We
    * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
    * first element is added.
    */
   private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

后者用于区别前者,若构造函数传入参数0,则每次扩容后的容量为0,1,2,3,4,6,9…

LinkedList

LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者堆栈使用。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!