Java集合——LinkedList
一、基础
LinkedList不是线程安全的,多线程建议使用Vector;
LinkedList
底层使用的是 双向链表 数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环);
LinkedList
不支持高效的随机元素访问;
实现了Cloneable接口,表明能被克隆;
实现了Serializabble接口,表明能序列化之后传输;
二、源码方法
构造方法:
无参构造方法public LinkedList() { },构造一个空的list
一个指定collection的构造函数public LinkedList(Collection<? extends E> c)构造一个包含指定collection的元素的列表,这些元素是按照该collection的迭代器返回它们的顺序排列的
方法:
add(E e) 方法:将元素添加到链表尾部,添加成功返回true
add(int index,E e):在指定位置添加元素,会先检查索引是否处于[0-size]之间
addAll(Collection c ):将集合插入到链表尾部,添加成功返回true
addAll(int index, Collection c): 将集合从指定位置开始插入,会先检查索引是否处于[0-size]之间,添加成功返回true
addFirst(E e): 将元素添加到链表头部
addLast(E e): 将元素添加到链表尾部,与 add(E e) 方法一样
get(int index): 根据指定索引返回数据
getFirst() 和element() 方法将会在链表为空时,抛出NoSuchElementException,element()方法的内部就是使用getFirst()实现的
peek(),peekFirst()链表为空时返回null
getLast() 方法在链表为空时,会抛出NoSuchElementException
peekLast() 则不会,只是会返回 null
int indexOf(Object o): 从头遍历找
int lastIndexOf(Object o): 从尾遍历找
contains(Object o): 检查对象o是否存在于链表中
remove() ,removeFirst(),pop(): 删除头节点
removeLast(),pollLast():removeLast()在链表为空时将抛出NoSuchElementException,而pollLast()方法返回null
remove(int index):删除指定位置的元素
三、总结
LinkedList底层的链表结构使它支持高效的插入和删除操作,源码的方法基本上也是插入和删除相关的,这些方法的逻辑基本如下:
- 没有指定位置的插入都是在表头或末尾,指定位置的插入需要先判断是否在size内
- 删除时指定位置的插入需要先判断是否在size内,并且注意链表为空时,是报错还是返回null