在本指南中,我们将通过实例看到LinkedList
类的实现。
Java LinkedList
类使用一个双链表来存储元素。它提供了一个链接列表的数据结构。它继承了AbstractList
类并实现了List
和Deque
接口。
关于Java LinkedList的重要内容是。
LinkedList
类可以包含重复的元素。LinkedList
类可以保持插入的顺序。LinkedList
类中,操作是快速的,因为不需要发生移位。LinkedList
类实现了Queue
和Deque
接口。因此,它也可以作为一个队列、Deque或堆栈使用。LinkedList
不是线程安全的。在多线程环境下,你必须明确地同步对LinkedList的并发修改。LinkedList
类的概述LinkedList
有例子的APIadd(String element)
add(int index, String element)
addFirst(String e)
addLast(String e)
addAll(Collection<? extends String> c)
LinkedList
有例子的APIremoveFirst()
removeLast()
remove(Object o)
removeIf(Predicate<? super String> filter)
clear()
LinkedList
2. 有例子的APIgetFirst()
getLast()
get(int index)
LinkedList
有例子的APIcontains(Object o)
indexOf(Object o)
lastIndexOf(Object o)
forEach()
方法遍历LinkedList
。forEach(Consumer<? super String> action)
Iterator java.util.AbstractSequentialList.iterator()
ArrayList
和LinkedList
之间的区别LinkedList
有例子的API让我们讨论用不同的方法向LinkedList
添加元素。
LinkedList<String> linkedList = new LinkedList<>();
add(String element)
使用*add()*方法将新元素添加到LinkedList的末尾。
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
add(int index, String element)
使用index方法在LinkedList的指定位置添加一个元素--add(index, element)。
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.add(3, "L");
System.out.println("After add(3, \"D\") : " + linkedList);
addFirst(String e)
使用*addFirst()*方法在LinkedList的开始添加一个元素
LinkedList<String> linkedList = new LinkedList<>();
linkedList.addFirst("R");
addLast(String e)
使用*addLast()*方法在链接列表的末尾添加一个元素
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.add(3, "L");
linkedList.addLast("J");
System.out.println("After addLast(\"F\") : " + linkedList);
addAll(Collection<? extends String> c)
将现有集合中的所有元素添加到LinkedList的末端
List<String> secondList= new ArrayList<>();
secondList.add("Jesse");
secondList.add("Walt");
linkedList.addAll(secondList);
System.out.println("After addAll(secondList) : " + linkedList);
。
LinkedList
API的实例让我们首先创建带有少量水果的LinkedList
,然后使用移除方法从LinkedList
中移除水果。
LinkedList<String> fruitList = new LinkedList<>();
fruitList.add("Apple");
fruitList.add("banana");
fruitList.add("mango");
fruitList.add("Pinaple");
System.out.println("Initial LinkedList = " + fruitList);
removeFirst()
删除LinkedList中的第一个元素。如果LinkedList为空,则抛出NoSuchElementException。
String element = fruitList.removeFirst();
System.out.println("Removed the first element " + element + " => " + fruitList);
removeLast()
删除LinkedList
中的最后一个元素。如果LinkedList为空,则抛出NoSuchElementException
。
element = fruitList.removeLast();
System.out.println("Removed the last element " + element + " => " + fruitList);
remove(Object o)
从LinkedList中移除第一次出现的指定元素
boolean isRemoved = fruitList.remove("banana");
if(isRemoved) {
System.out.println("Removed banana => " + fruitList);
}
removeIf(Predicate<? super String> filter)
移除这个集合中满足给定谓词的所有元素。在迭代过程中或由谓词抛出的错误或运行时异常将被转达给调用者。
fruitList.removeIf(programmingLanguage -> programmingLanguage.startsWith("C"));
System.out.println("Removed elements starting with C => " + fruitList);
clear()
移除此列表中的所有元素。这个调用返回后,列表将是空的。
fruitList.clear();
System.out.println("Cleared the LinkedList => " + fruitList);
LinkedList
API的例子一个包含某公司过去6天的股票价格的关联列表
LinkedList<Double> stockPrices = new LinkedList<>();
stockPrices.add(45.00);
stockPrices.add(51.00);
stockPrices.add(62.50);
stockPrices.add(42.75);
stockPrices.add(36.80);
stockPrices.add(68.40);
getFirst()
返回该列表中的第一个元素。
Double firstElement = stockPrices.getFirst();
System.out.println("Initial Stock Price : " + firstElement);
getLast()
返回这个列表中的最后一个元素。
Double lastElement = stockPrices.getLast();
System.out.println("Current Stock Price : " + lastElement);
get(int index)
获取LinkedList中指定位置的元素
Double stockPriceOn3rdDay = stockPrices.get(2);
System.out.println("Stock Price on 3rd Day : " + stockPriceOn3rdDay);
LinkedList
例子中的API让我们创建一个雇员列表并应用LinkedList
搜索方法。
LinkedList<String> employees = new LinkedList<>();
employees.add("John");
employees.add("David");
employees.add("Lara");
employees.add("Chris");
employees.add("Steve");
employees.add("David");
contains(Object o)
检查LinkedList是否包含一个元素
System.out.println("Does Employees LinkedList contain \"Lara\"? : " + employees.contains("Lara"));
indexOf(Object o)
查找LinkedList中第一次出现的元素的索引
System.out.println("indexOf \"Steve\" : " + employees.indexOf("Steve"));
System.out.println("indexOf \"Mark\" : " + employees.indexOf("Mark"));
lastIndexOf(Object o)
查找LinkedList中最后出现的元素的索引
System.out.println("lastIndexOf \"David\" : " + employees.lastIndexOf("David"));
System.out.println("lastIndexOf \"Bob\" : " + employees.lastIndexOf("Bob"));
LinkedList
。package com.javaguides.collections.linkedlistexamples;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
public class IterateOverLinkedListExample {
public static void main(String[] args) {
LinkedList < String > progLangs = new LinkedList < > ();
progLangs.add("C");
progLangs.add("C++");
progLangs.add("Core Java");
progLangs.add("Java EE");
progLangs.add("Spring Framework");
progLangs.add("Hibernate Framework");
System.out.println("=== Iterate over a LinkedList using Java 8 forEach and lambda ===");
progLangs.forEach(name - > {
System.out.println(name);
});
System.out.println("\n=== Iterate over a LinkedList using iterator() ===");
Iterator < String > iterator = progLangs.iterator();
while (iterator.hasNext()) {
String speciesName = iterator.next();
System.out.println(speciesName);
}
System.out.println("\n=== Iterate over a LinkedList using iterator() and Java 8 forEachRemaining() method ===");
iterator = progLangs.iterator();
iterator.forEachRemaining(speciesName - > {
System.out.println(speciesName);
});
System.out.println("\n=== Iterate over a LinkedList using descendingIterator() ===");
Iterator < String > descendingIterator = progLangs.descendingIterator();
while (descendingIterator.hasNext()) {
String speciesName = descendingIterator.next();
System.out.println(speciesName);
}
System.out.println("\n=== Iterate over a LinkedList using listIterator() ===");
// ListIterator can be used to iterate over the LinkedList in both forward and backward directions
// In this example, we start from the end of the list and traverse backwards
ListIterator < String > listIterator = progLangs.listIterator(progLangs.size());
while (listIterator.hasPrevious()) {
String speciesName = listIterator.previous();
System.out.println(speciesName);
}
System.out.println("\n=== Iterate over a LinkedList using simple for-each loop ===");
for (String name: progLangs) {
System.out.println(name);
}
}
}
=== Iterate over a LinkedList using Java 8 forEach and lambda ===
C
C++
Core Java
Java EE
Spring Framework
Hibernate Framework
=== Iterate over a LinkedList using iterator() ===
C
C++
Core Java
Java EE
Spring Framework
Hibernate Framework
=== Iterate over a LinkedList using iterator() and Java 8 forEachRemaining() method ===
C
C++
Core Java
Java EE
Spring Framework
Hibernate Framework
=== Iterate over a LinkedList using descendingIterator() ===
Hibernate Framework
Spring Framework
Java EE
Core Java
C++
C
=== Iterate over a LinkedList using listIterator() ===
Hibernate Framework
Spring Framework
Java EE
Core Java
C++
C
=== Iterate over a LinkedList using simple for-each loop ===
C
C++
Core Java
Java EE
Spring Framework
Hibernate Framework
ArrayList
内部使用动态数组来存储元素。 LinkedList
内部使用双链表来存储元素。
使用ArrayList
的操作很慢,因为它内部使用了一个数组。如果从数组中删除任何元素,所有的位都会在内存中移位。用LinkedList
进行操作比ArrayList
快,因为它使用一个双链表,所以不需要在内存中移位。
ArrayList
类只能作为一个列表,因为它只实现了List
。LinkedList
类可以作为列表和队列,因为它实现了 List
和 Deque
接口。
ArrayList
更适合于存储和访问数据。LinkedList
更适合于操作数据。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.javaguides.net/2018/06/guide-to-linkedlist-class.html
内容来源于网络,如有侵权,请联系作者删除!