Java 中 ArrayList 和 LinkedList 的區別
Mohammad Irfan
2023年10月12日
本教程介紹在 Java 中如何初始化 char 和 char 型別的初始值。
在 Java 中,ArrayList 和 LinkedList 都是實現 List 介面的類。ArrayList 是 List 介面的可調整大小的陣列實現,而 LinkedList 是 Java 中 List 介面的雙向連結串列實現。
ArrayList 和 LinkedList 都用於儲存資料,但由於實現型別的不同而存在一些差異。在本文中,我們將通過示例來總結這些之間的一些主要差異。
操作 | ArrayList | LinkedList |
---|---|---|
新增元素 | 花更多時間 | 花更少的時間 |
訪問元素 | 花更少的時間 | 花更多時間 |
刪除元素 | 花更多時間 | 花更少的時間 |
迭代元素 | 花更少的時間 | 花更多時間 |
搜尋元素 | 花更少的時間 | 花更多時間 |
- LinkedList 的效能問題
它使用大量不利於快取區域性性的小記憶體物件,並在整個過程中產生效能問題。
儘管 LinkedList 新增和刪除元素的速度很快,但是如果我們訪問特定的元素,它就很慢。相比之下,ArrayList 訪問特定元素的速度很快,但如果新增則很慢,如果從中間刪除元素則很慢。
Java 中的 ArrayList 示例
在這個例子中,我們建立了一個 ArrayList 並應用了一些操作,例如新增、刪除和訪問元素。我們在執行操作時測量時間,以便我們可以瞭解 ArrayList 和 LinkedList 之間的效能差異。請參閱下面的示例。
import java.util.ArrayList;
import java.util.List;
public class SimpleTesting {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
System.out.println("Adding Time : " + addElement(list, 10));
System.out.println("Adding Time : " + addElement(list, 2));
System.out.println(list);
System.out.println("Accessing Time : " + accessElement(list, 1));
System.out.println("Removing Time : " + removeElement(list, 1));
System.out.println(list);
}
static long addElement(List<Integer> list, int element) {
long starttime = System.nanoTime();
list.add(element);
long endtime = System.nanoTime();
return (endtime - starttime);
}
static long accessElement(List<Integer> list, int index) {
long starttime = System.nanoTime();
int el = list.get(index);
System.out.println("Element found : " + el);
long endtime = System.nanoTime();
return (endtime - starttime);
}
static long removeElement(List<Integer> list, int index) {
long starttime = System.nanoTime();
list.remove(index);
long endtime = System.nanoTime();
return (endtime - starttime);
}
}
輸出:
Adding Time : 48556
Adding Time : 2090
[10, 2]
Element found : 2
Accessing Time : 42301
Removing Time : 6471
[10]
Java 中的 LinkedList 示例
在這個例子中,我們建立了一個 LinkedList 並應用了一些操作,例如新增、刪除和訪問元素。我們在執行操作時也會測量時間,以便我們可以瞭解 ArrayList 和 LinkedList 之間的效能差異。請參閱下面的示例。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class SimpleTesting {
public static void main(String[] args) {
List<Integer> list = new LinkedList<Integer>();
System.out.println("Adding Time : " + addElement(list, 10));
System.out.println("Adding Time : " + addElement(list, 2));
System.out.println(list);
System.out.println("Accessing Time : " + accessElement(list, 1));
System.out.println("Removing Time : " + removeElement(list, 1));
System.out.println(list);
}
static long addElement(List<Integer> list, int element) {
long starttime = System.nanoTime();
list.add(element);
long endtime = System.nanoTime();
return (endtime - starttime);
}
static long accessElement(List<Integer> list, int index) {
long starttime = System.nanoTime();
int el = list.get(index);
System.out.println("Element found : " + el);
long endtime = System.nanoTime();
return (endtime - starttime);
}
static long removeElement(List<Integer> list, int index) {
long starttime = System.nanoTime();
list.remove(index);
long endtime = System.nanoTime();
return (endtime - starttime);
}
}
輸出:
Adding Time : 82591
Adding Time : 4218
[10, 2]
Element found : 2
Accessing Time : 54516
Removing Time : 7572
[10]