合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## [链表LinkedList](https://lingcoder.gitee.io/onjava8/#/book/12-Collections?id=%e9%93%be%e8%a1%a8linkedlist) **LinkedList**也像**ArrayList**一样实现了基本的**List**接口,但它在**List**中间执行插入和删除操作时比**ArrayList**更高效。然而,它在随机访问操作效率方面却要逊色一些。 **LinkedList 还添加了一些方法,使其可以被用作栈、队列或双端队列(deque)**。在这些方法中,有些彼此之间可能只是名称有些差异,或者只存在些许差异,以使得这些名字在特定用法的上下文环境中更加适用(特别是在**Queue**中)。例如: * `getFirst()`和`element()`是相同的,它们都返回列表的头部(第一个元素)而并不删除它,如果**List**为空,则抛出**NoSuchElementException**异常。`peek()`方法与这两个方法只是稍有差异,它在列表为空时返回**null**。 * `removeFirst()`和`remove()`也是相同的,它们删除并返回列表的头部元素,并在列表为空时抛出**NoSuchElementException**异常。`poll()`稍有差异,它在列表为空时返回**null**。 * `addFirst()`在列表的开头插入一个元素。 * `offer()`与`add()`和`addLast()`相同。 它们都在列表的尾部(末尾)添加一个元素。 * `removeLast()`删除并返回列表的最后一个元素。 下面的示例展示了这些功能之间基本的相似性和差异性。它并不是重复执行**ListFeatures.java**中所示的行为: ~~~ // collections/LinkedListFeatures.java import typeinfo.pets.*; import java.util.*; public class LinkedListFeatures { public static void main(String[] args) { LinkedList<Pet> pets = new LinkedList<>(Pets.list(5)); System.out.println(pets); // Identical: System.out.println( "pets.getFirst(): " + pets.getFirst()); System.out.println( "pets.element(): " + pets.element()); // Only differs in empty-list behavior: System.out.println("pets.peek(): " + pets.peek()); // Identical; remove and return the first element: System.out.println( "pets.remove(): " + pets.remove()); System.out.println( "pets.removeFirst(): " + pets.removeFirst()); // Only differs in empty-list behavior: System.out.println("pets.poll(): " + pets.poll()); System.out.println(pets); pets.addFirst(new Rat()); System.out.println("After addFirst(): " + pets); pets.offer(Pets.get()); System.out.println("After offer(): " + pets); pets.add(Pets.get()); System.out.println("After add(): " + pets); pets.addLast(new Hamster()); System.out.println("After addLast(): " + pets); System.out.println( "pets.removeLast(): " + pets.removeLast()); } } /* Output: [Rat, Manx, Cymric, Mutt, Pug] pets.getFirst(): Rat pets.element(): Rat pets.peek(): Rat pets.remove(): Rat pets.removeFirst(): Manx pets.poll(): Cymric [Mutt, Pug] After addFirst(): [Rat, Mutt, Pug] After offer(): [Rat, Mutt, Pug, Cymric] After add(): [Rat, Mutt, Pug, Cymric, Pug] After addLast(): [Rat, Mutt, Pug, Cymric, Pug, Hamster] pets.removeLast(): Hamster */ ~~~ `Pets.list()`的结果被传递给**LinkedList**的构造器,以便使用它来填充**LinkedList**。如果查看**Queue**接口就会发现,它在**LinkedList**的基础上添加了`element()`,`offer()`,`peek()`,`poll()`和`remove()`方法,以使其可以成为一个**Queue**的实现。**Queue**的完整示例将在本章稍后给出。