1. 程式人生 > 其它 >邊框(Border) 和 輪廓(Outline) 屬性

邊框(Border) 和 輪廓(Outline) 屬性

前言
Java的資料結構是面試考察的重點,只要參與過Java面試的同學相信都有所體會。面試官在問此類問題的時候往往是想考察你是否研究過Java中常用資料型別的底層結構,而不是隻是簡單的停留在"會使用"的層次。那麼在面試的過程中我們如何把這個問題說好,讓面試官滿意呢?我們一起來看看下面的分析,希望能幫助到你。

ArrayList和LinkedList簡介
ArrayList底層是一個Object型別的陣列,初始容量是10,支援動態擴容,擴容後的容量是當前容量的1.5倍,它的最大容量是 Integer.MAX_VALUE - 8(但是仍可以擴容到Integer.MAX_VALUE),對於空出的8位,目前的解釋是避免一些機器記憶體溢位,減少出錯機率。

LinkedList底層是一個雙向連結串列,初始容量是0,擴容只需新建節點進行指標指向即可。

區別
查詢

ArrayList隨機訪問效率很高,因為元素的儲存是有序的,通過下標index可以知道所查詢資料在記憶體中的位置,定址快,時間複雜度O(1);
LinkedList查詢效率較低,它在查詢指定資料的時候需要遍歷連結串列逐個查詢,時間複雜度O(n)。
插入

ArrayList在尾部插入的效率比較高,時間複雜度O(1),但是在其他位置插入效率則比較低,需要進行大量的資料移動,時間複雜度O(n);
LinkedList在頭部和尾部插入元素的效率比較高,時間複雜度為O(1),但是在中間指定位置插入元素,需要先遍歷找到元素的位置,然後插入,時間複雜度O(n)。
刪除

ArrayList移除元素除了末尾節點之外都伴隨著需要進行大量的資料移動,時間複雜度O(n);
LinkedList刪除元素效率相對較高,只需要改變指標的指向,但是刪除元素需要遍歷查詢出資料的位置,時間複雜度O(n)。
記憶體空間

ArrayList基於陣列實現,每次擴容後容量是固定的,所以在尾部會預留一部分的空間;
LinkedList基於雙向連結串列實現,所以每個節點除了儲存資料之外還需要儲存前後節點的指標,會消耗一部分空間。
擴容機制

ArrayList每次擴容需要把原陣列的元素複製到新的數組裡面去;
LinkedList是連結串列,不存在擴容的說法。
相同點
執行緒安全性

ArrayList和 LinkedList都是執行緒不安全的,多執行緒環境下容易造成髒讀的問題,可以使用Collections.synchronizedList()方法保證執行緒的安全性。

儲存特點

儲存的元素都是有序的,都是可以重複的,新增元素都是儲存到List的末尾處。