java八股文-容器
List
有序;可重复;可通过索引值操作元素
ArrayList
jdk1.8 中ArrayList底层先创建又给长度为0的数组,当第一次添加元素(调用add()方法)时,会初始化一个长度为10的数组,ArrayList容量使用完后,会“自动”创建容量更大的数组,并将原数组中所有元素所有元素拷贝过去,这会导致效率下降。可以使用构造放方法ArrayList(int capacity)或ensureCapacity(int capacity)提供一个初始化容量,避免刚开始就一直扩容,造成效率较低
- ArrayList特点:
- 优点:向ArrayList末尾添加元素(add())时,效率高;查询效率高
- 缺点:
- 数组无法存储大数据量(因为很难找到一块很大的连续内存空间),扩容机制有额外的消耗。
- 向ArrayList中添加元素,需要移动元素,效率较低
- 但是,向ArrayList中位置增/删元素较少时不影响
- 如果增删较多,可以考虑用链表
- 遍历的时候可以采用索引的方式访问,随机访问
ArrayList构造方法:
- ArrayList(): 创建一个初始化容量为10的空列表
- ArrayList(int initialCapacity): 创建一个指定初始化容量为 initialCapacity的空列表
- ArrayList(Collection<? extends E> c):创建又给包含指定集合中所有元素的列表
LinkedList
-
LinkedList特点
- 数据结构:LinkedList底层是一个双向链表
- 优点:增/删效率高
- 缺点:查询效率低
- 遍历的时候最好使用foreach访问,因为LinkedList可以调用get(int index) 方法。返回表中第index个元素,但是,每次都要从头结点开始遍历。
-
LinkedList部分源码解读
add()方法
ListIterator 接口
-
LinkedList.add 方法只能将数据添加到链表的末尾
-
如果要将对象添加到链表的中间位置,则需要使用ListIterator接口的add方法
ListIterato是Iterator的一个子接口
- Iterator中的remove() 方法
- 调用next之后,remove方法删除的是迭代器左侧的元素
- 调用previous之后,remove删除的是迭代器右侧的元素
- ListIterator中add方法
- 调用next之后,在迭代器左侧添加一个元素
- 调用previou