LinkedList主要有两种形式:单向链表和双向链表(一般会用 双向链表)
- 根据API1.6中可以知道:
1.和ArrayList一样,LinkedList是线程不同步的,同步可用方法:
List list = Collections.synchronizedList(new LinkedList(…));
2.此类实现List 接口。LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作使LinkedList既可以看做是一个队列(Queue),又可以看做一个栈(Stack)。即当我们想要使用队列或栈时,可以考虑使用LinkedList,由于Java官方声明不建议使用Stack类(stack在底层继承vector),Queue只是一个接口。关于栈和队列现在首选ArrayDeque,在实现栈和队列的问题上它有着更好的性能。
3.此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
4.LinkedList的每个节点用内部类Node表示
LinkedList和ArrayList比较
- 查询和修改用ArrayList
- 删除和添加用LinkedList
在LinkedList中的查询方法同样也用的get(int index)方法为什么比ArrayList中的get(int index)方法速度慢呢?
ArrayList在底层操作的是数组,也就是在内存中是一片连续的空间,所以可以直接获得index相对应的元素
LinkedList是链表在内存中不是一段连续的空间,所以当get(in)时,必须从首元素开始一次获得下一个元素的index,直到与in相等。
在知乎上看到一个前辈说的很好的一个例子
假如有很多人,排成长队,这个时候要找5号的人就非常简单,问都不用问,直接定位。假如不排成长队,只是随机站在很大的广场里面,但是每个人只知道自己的前一个人和后一个人的位置,而且你只知道第一个人的位置,这个时候你要找第5个人的时候你就得从第一个人开始问后面的是谁,一直问下去才知道第5个人在哪里。
LinkedList中的常用方法
LinkedList中存在的方法和ArrayList中的方法基本一样,在此列举几个常用的。
在LinkedList中也有对索引的操作,此操作是基于Node内部类的基础上的。
由于LinkedList中有addFirst(),addLast(),getFirst(),getLast()方法,所以用LinkedList实现Queue,队列只是特定功能的LinkedList,二者实现的方法是一样的。
- add
两种情况:
public boolean add(E e)
将指定元素添加到此列表的结尾。 此方法等效于 addLast(E)。
public void add(int index,E element)
在此列表中指定的位置插入指定的元素。移动当前在该位置处的元素(如果有),所有后续元素都向右移(在其索引中添加 1)。
- addFirst
public void addFirst(E e)
将指定元素插入此列表的开头。
- addLast
public void addLast(E e)
将指定元素添加到此列表的结尾。
- get
public E get(int index)
返回此列表中指定位置处的元素。
- getFirst
public E getFirst()
返回此列表的第一个元素。
- getLast
public E getLast()
返回此列表的最后一个元素。
- set
public E set(int index,E element)
将此列表中指定位置的元素替换为指定的元素。
- remove
public E remove()
获取并移除此列表的头(第一个元素)。
remove
public E remove(int index)
移除此列表中指定位置处的元素。将任何后续元素向左移(从索引中减 1)。返回从列表中删除的元素。remove
public boolean remove(Object o)
从此列表中移除首次出现的指定元素(如果存在)。