list脑图
一、方法:主要说一下增删改查
add(E)、add(int, E)、remove(int)、remove(Object)、set(int, E)、forEach()、iterator()
add(E):在末尾增加元素
add(int, E):在指定位置增加元素
remove(int):删除指定位置的元素
remove(Object):删除指定元素
set(int, E):修改指定位置的元素
forEach():for循环遍历集合
iterator():迭代器遍历元素
LinkedList特有方法:
addFirst(E e):在链表头部插入一个元素;
addLast(E e):在链表尾部添加一个元素;
push(E e):与addFirst方法一致;
offer(E e):在链表尾部插入一个元素;
removeFirst(E e):删除头,获取元素并删除;
removeLast(E e):删除尾,获取元素并删除;
pollFirst():删除头;
pollLast():删除尾;
getFirst():获取第一个元素;
getLast():获取最后一个元素;
peek():获取第一个元素,但是不移除;
pollFirst():查询并删除头;
pollLast():删除尾;
poll():查询并移除第一个元素;
二、组成:
1、ArrayList:底层数组,查询快,增删慢,线程不安全(效率高)
查询快:因为底层是数组,在查询的时候可以根据索引来查询效率高;
增删慢:在添加或者删除中间元素时,会改变数组的结构,所以效率低;
2、LinkedList:底层链表,查询慢,增删快,线程不安全(效率高)
查询慢:因为底层是链表,在查询时需要从头开始找所以效率低;
增删快:在添加或者删除中间元素时,只需要改变节点的指向,所以效率高;
3、vector:线程安全(相对ArrayList效率低),底层是数组
三、扩容机制
//维护了一个Object类型的数组elementData
//transient:表示只序列化有实际值的元素,如:此时数组长度为10,现在只有5个元素,则只序列化这5个元素
transient Object[] elementData;
//elementData原来的数组,newCapacity为新数组的长度
elementData = Arrays.copyOf(elementData, newCapacity);
1、ArrayList:使用的扩容方法:Arrays.copyOf()
//构造一个具有指定初始elementData容量的0,需要扩容时,则直接扩容elementData为1.5倍
public ArrayList(int initialCapacity)
//默认构造一个初始elementData容量为0,第一次添加elementData容量变为10,
//然后再次扩容时,elementData容量为1.5倍
public ArrayList()
//构造一个包含指定 collection 的元素的列表
public ArrayList(Collection<? extends E> c)
2、vector:使用的扩容方法:Arrays.copyOf()
//使用指定的初始容量0,下次扩容为10,再次扩容为原来的2倍
public Vector()
//指定容量,下次扩容为原来的2倍
public Vector(int initialCapacity)
//构造一个包含指定 collection 的元素的列表
public Vector(Collection<? extends E> c)
//使用指定的初始容量和容量增量
public Vector(int initialCapacity,int capacityIncrement)
3、LinkedList:没有扩容机制,往链表前后加元素