您好,登錄后才能下訂單哦!
1. LinkedList
2. ArrayList
那么這兩者有什么異同呢
首先是代碼測試:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import bean.Answer;
import bean.User;
/**
* 測試類
*
* @author hxz
*
*/
public class MyTestUtil {
public static void addTest(List list) {
System.out.println(list.getClass().getName() + "開始查詢");
long start = System.currentTimeMillis();
System.out.println("開始時間:" + start);
list.add("需要查找的數據");
list.add("eeee");
list.add("aaee");
list.add("abbb");
for (int i = 0; i < 10000000; i++) {
for (int j = 0; j < list.size(); j++) {
list.get(j).contains("e");
System.out.print("");
}
}
long end = System.currentTimeMillis();
System.out.println("結束時間:" + end);
System.out.println("總耗時:" + (end - start));
}
public static void main(String[] args) {
List a = new ArrayList<>();
List b = new LinkedList<>();
addTest(a);
addTest(b);
}
}
???不是說ArrayList查詢快于LinkedList么?
然后我們測試增加
???簡直顛覆我的認知!
難道我學的都是錯的嗎?
事情的真相只有一個!
首先我們需要了解
linkedLIst是雙向鏈表結構
元素之間的所有關系是通過引用關聯的,就好比最近特別火的從袖子里撤出棒棒糖來的情景,想要撤出下一個就必須撤出上一個。它在查詢的時候,只能一個一個的遍歷查詢,所以他的查詢效率很低,如果我們想刪除一節怎么辦呢?就相當于自行車的鏈子,有一節壞了,我們是不是直接把壞的那節仍掉,然后讓目標節的上一節指向目標節的下一節,但是
ArrayList是數組結構鄭州好的婦科醫院 http://www.zzkedayy.com/
就是有相同特性的一組數據的箱子,比如說我有一個能容下10個蘋果的箱子,我現在只放了5個蘋果,那么放第6個是不是直接放進去就行了?呢我要放11個呢?這個箱子是不是放不下了?所以我是不是需要換個大點的箱子?這就是**數組的擴容!**同樣,我們一般放箱子里面的東西是不是按照順序放的?假如說是按abcd的順序放的,我突然想添加一個e,這個e要放到c的后面,你是不是需要把d先拿出來,再把e放進去,再把d放進去?假如說c后面有10000個呢?你是不是要把這10000個都拿出來,把e放進去,再放這10000個?效率是不是很低了?所以,理論上它的增刪比較慢!但是前面也說了,我們箱子里面放東西,都是按照順序放的,所以我知道其中一個"地址",是不是就知道所有元素的地址?所以它的查詢在理論上比較快!
注意:只是在在list容量較大情況下,ArrayList查詢數據要遠優于LinkedList
總結
ArrayList和LinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:
對ArrayList而言,主要是在內部數組中增加一項數據,指向所添加的元素,偶爾復雜度為O(n)可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是統一的,復雜度為O(1),分配一個內部對象。
在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
LinkedList不支持高效的隨機元素訪問。
只是在在list容量較大情況下,ArrayList查詢數據要遠優于LinkedList
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。