目录
介绍
双向链表,实现了List和Deque接口。实现了List接口下的所有操作且元素包含null值。
特性
几个比较重要的特性
1、not synchronized 不是线程安全的
2、通过iterator和listiterator迭代器是fail-fast,意思就是说如果在遍历集合中对元素进行修改则会抛出 ConcurrentModificationException
3、每一个元素就是一个节点,保留对上和下节点的引用
4、保持插入顺序
尽管LinkedList不是线程安全的,不过可以Collections实现线程安全
List list = Collections.synchronizedList(new LinkedList(...));
和ArrayList比较
都实现了List接口,语义不同根据特定场合选择使用
数据结构
ArryList 是数组,LinkedList是双向链表
操作
LinkedList在插入、扩展、删除的操作效率更高一些,因为无需重定义数组的大小只需要在添加元素到集合的任意位置时更新一下节点的引用即可
内存使用率
LinkedList的内存使用率更高一些,因为每个节点都会有两个引用对前一个元素和后一个元素,而ArrayList则只有数据和索引
用法
创建
LinkedList<Object> linkedList = new LinkedList<>();
添加元素
add() addAll() addFirst() addLast()
删除元素
removeFirst() removeLast() removeLastOccurrence() removeFirstOccurrence()
队列操作
双向队列提供类似队列的行为(实际上双向队列接口继承单向队列)
linkedList.poll();
linkedList.pop();
方法的意思获取第一个元素并从集合中删除它。
不同点是当集合为空时pop会抛出NoSuchElementException 而poll 则会return null
新增元素
linkedList.push(Object o);
添加元素作为集合的头
结论
ArryList 通常默认为List的接口实现,但是当元素频繁添加、删除和修改是建议使用LinkedList提高操作效率。