文章目录
List集合框架
1.List的三个实现类
ArrayList:作为List接口主要实现类,线程不安全,效率高,底层使用object数组存储(Object[] elementData),可以通过Collections工具类使ArrayList变成线程安全的。
Vector:作为List的古老实现,线程安全,效率低, 底层使用object数组存储(Object[] elementData)。现在几乎不使用。
LinkedList:底层使用双向链表来存储,对于频繁的插入,删除操作,使用此类要比使用ArrayList效率高,但查询的效率要更低。
2.ArrayList的源码分析
2.1 jdk 7情况下
在初始化时直接就创建了一个长度为10的,如果在添加时底层的elementData数组长度不够的话,则扩容。
在默认情况下,扩容为原来的1.5倍,同时需要把原来数组中的数据复制到新的数组中。
2.2 jdk 8 中ArrayList的变化
ArrayList[] a = new ArrayList(),底层将Object[] elementData 初始化为{},并没有创建数组,在第一次调用add后,才创建长度为10的数组。
后序的添加,扩容与jdk7无异。
jdk 8 延迟了数组创建的时间,节省了内存。
3.LinkedList的源码分析
LinkedList底层使用了双向链表,里面有一个Node类,声明了Node类型的first,last。
Node的结构为:
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
剩下的add,remove都涉及到链表的算法。
4. List接口添加的方法
List接口作为Collection子接口,应该定义了Collection接口中所有方法,由于List是有序集合,List接口在Collection的基础上添加了下列方法:
-
void add(int index, Object element):
将元素element插入到List集合的index处。要注意,这个方法和Collection接口规定的方法不是一个方法,虽然他们的名字都是add,但函数返回值,参数都不一样,所以他们不是同一个方法。 -
boolean addAll(int index,Collection c):
将集合C所包含的所有元素都插入到List集合的index处。同样他和Collection接口规定的方法不是一个方法 -
Object get(int index): 返回集合index处的元素。
-
int indexOf(Object o): 返回对象O在集合中第一次出现的位置的索引。
-
int lastIndexOf(Object o):返回对象O在集合中最后一次出现的位置的索引。
-
Object remove(int index): 删除并返回index索引处的元素。
-
Object set(int index, Object element):将index索引处的元素替换成element对象,并返回被替换的旧元素。
-
List subList(int fromIndex,Object element): 返回从 fromindex(包含),到 toindex(不包含)处所有元素组成的子集合。就是切片了。
-
void replaceAll(UnaryOperator operator):根据 operator指定的计算规则重新设计集合所有元素。
-
void sort(Comparator c): 根据c参数
-
ListIterator listIterator(): List不仅提供Iterator方法,还提供了listiterator方法,该方法返回一个ListerIterator接口的实现类,该接口继承了Iterator接口,在Iterator接口的基础上,添加了:
-
boolean hasPrevious(): 判断集合中某个元素是否有上一个元素。
-
Object previous(): 返回迭代器上一个元素
-
void add(Object o): 在上一次迭代元素的后面添加一个新元素。
-
从这些提供的方法不难看出,ListIterator还可以添加元素(Iterator只能remove),还可以反向迭代。要注意的是:ListIterator接口继承Iterator接口,所以Iterator有的方法它都有,不是只有上面三个方法,它也可以remove,也可以正向迭代。
常用方法
-
增:boolean add(Object obj)
-
删:Object remove(Object obj) / remove(int index)
-
改:Object set(int index, Object element)
-
查:Object get(int index);
-
插:boolean add(int index, Object element)
-
遍历:
-
Iterator迭代器
-
增强for循环
-
根据index,使用普通的循环
-