Java 中的數組與列表性能
[乳膠頁]
一、簡介
在 Java 編程語言中,數組和列表是存儲元素集合的兩種主要數據結構。
數組和列表各有利弊,選擇合適的數據結構取決於我們用例的具體要求。
在本教程中,我們將檢查 Java 中數組和列表之間的性能差異,並提供測試示例以使用 Java Microbenchmark Harness (JMH) 比較它們的效率。
2.創建新對象的表現
讓我們使用一個簡單的 Java 示例來比較創建數組和ArrayList
的性能:
@Benchmark
public Integer[] arrayCreation() {
return new Integer[256];
}
@Benchmark
public ArrayList<Integer> arrayListCreation() {
return new ArrayList<>(256);
}
下表顯示了以納秒為單位創建數組和ArrayList
所花費的時間:
基準 | 模式 | 計數 | 時間 | 錯誤 | 單位 |
---|---|---|---|---|---|
陣列 - 創建 | 平均值 | 5個 | 202.909 | 2.135 | 納秒/操作 |
列表 - 創建 | 平均值 | 5個 | 231.565 | 103.332 | 納秒/操作 |
結果表明,創建數組的平均時間 (202.909 ns/op) 比創建ArrayList
的平均時間 (231.565 ns/op) 快得多。
3. 添加項目的表現
讓我們比較一下在數組和ArrayList
中添加項目的性能:
@Benchmark
public Integer[] arrayItemsSetting() {
for (int i = 0; i < 256; i++) {
array[i] = i;
}
return array;
}
@Benchmark
public ArrayList<Integer> arrayListItemsSetting() {
for (int i = 0; i < 256; i++) {
list.add(i);
}
return list;
}
下表顯示了為數組和ArrayList
中的項目設置值所花費的時間(以納秒為單位):
基準 | 模式 | 計數 | 時間 | 錯誤 | 單位 |
---|---|---|---|---|---|
數組——加法 | 平均值 | 5個 | 2587.040 | 671.391 | 納秒/操作 |
列表 - 添加 | 平均值 | 5個 | 2269.738 | 906.403 | 納秒/操作 |
基準測試結果表明,在數組中設置一項所需的平均時間為 (2587.040 ns/op),這比創建ArrayList
所需的平均時間 (2269.738 ns/op) 慢。
4. 獲取物品的表現
讓我們比較一下從數組和ArrayList
獲取項目值的性能:
@Benchmark
public void arrayItemsRetrieval(Blackhole blackhole) {
for (int i = 0; i < 256; i++) {
int item = array[i];
blackhole.consume(item);
}
}
@Benchmark
public void arrayListItemsRetrieval(Blackhole blackhole) {
for (int i = 0; i < 256; i++) {
int item = list.get(i);
blackhole.consume(item);
}
}
下表顯示了從數組和 ArrayList 中檢索項目所花費的時間(以納秒為單位):
基準 | 模式 | 計數 | 時間 | 錯誤 | 單位 |
---|---|---|---|---|---|
數組 - 獲取 | 平均值 | 5個 | 102.974 | 2.569 | 納秒/操作 |
列表 - 獲取 | 平均值 | 5個 | 244.635 | 166.331 | 納秒/操作 |
該陣列具有更快的項目檢索時間(102.974 ns/op)。相比之下, ArrayList
的項目檢索時間更長,為 (244.635 ns/op),因為需要遍曆元素以找到所需的項目。
5. 克隆性能
讓我們比較一下克隆/複製數組和ArrayList
的性能:
@Benchmark
public void arrayCloning(Blackhole blackhole) {
Integer[] newArray = array.clone();
blackhole.consume(newArray);
}
@Benchmark
public void arrayListCloning(Blackhole blackhole) {
ArrayList<Integer> newList = new ArrayList<>(list);
blackhole.consume(newList);
}
下表顯示了以納秒為單位克隆/複製數組和 ArrayList 所花費的時間:
基準 | 模式 | 計數 | 時間 | 錯誤 | 單位 |
---|---|---|---|---|---|
陣列 - 克隆 | 平均值 | 5個 | 204.608 | 5.270 | 納秒/操作 |
列表 - 克隆 | 平均值 | 5個 | 232.177 | 80.040 | 納秒/操作 |
數組克隆比ArrayList
快得多,因為數組創建是一種更簡單的操作,涉及分配連續的內存塊,而ArrayList
創建涉及額外的開銷,例如初始化內部數據結構和在添加元素時動態調整列表的大小。
請記住,實際性能可能因各種因素而異,例如集合的大小和執行代碼的硬件。
六,結論
總之,本文比較了 Java 中數組和列表的性能。但是,請務必注意,實際性能可能因集合大小和硬件而異。
GitHub 上提供了完整的示例代碼。