LinkedeList和ArrayList的區(qū)別
1、數(shù)據(jù)結構不同
ArrayList是Array(動態(tài)數(shù)組)的數(shù)據(jù)結構,LinkedList是Link(鏈表)的數(shù)據(jù)結構。
2、效率不同
當隨機訪問List(get和set操作)時,ArrayList比LinkedList的效率更高,因為LinkedList是線性的數(shù)據(jù)存儲方式,所以需要移動指針從前往后依次查找。
當對數(shù)據(jù)進行增加和刪除的操作(add和remove操作)時,LinkedList比ArrayList的效率更高,因為ArrayList是數(shù)組,所以在其中進行增刪操作時,會對操作點之后所有數(shù)據(jù)的下標索引造成影響,需要進行數(shù)據(jù)的移動。
3、自由性不同
ArrayList自由性較低,因為它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創(chuàng)建,然后添加數(shù)據(jù),通過調用下標進行使用;而LinkedList自由性較高,能夠動態(tài)的隨數(shù)據(jù)量的變化而變化,但是它不便于使用。
4、主要控件開銷不同
ArrayList主要控件開銷在于需要在lList列表預留一定空間;而LinkList主要控件開銷在于需要存儲結點信息以及結點指針信息。
LinkedeList和ArrayList的區(qū)別
1、數(shù)據(jù)結構不同
ArrayList是Array(動態(tài)數(shù)組)的數(shù)據(jù)結構,LinkedList是Link(鏈表)的數(shù)據(jù)結構。
2、效率不同
當隨機訪問List(get和set操作)時,ArrayList比LinkedList的效率更高,因為LinkedList是線性的數(shù)據(jù)存儲方式,所以需要移動指針從前往后依次查找。
當對數(shù)據(jù)進行增加和刪除的操作(add和remove操作)時,LinkedList比ArrayList的效率更高,因為ArrayList是數(shù)組,所以在其中進行增刪操作時,會對操作點之后所有數(shù)據(jù)的下標索引造成影響,需要進行數(shù)據(jù)的移動。
3、自由性不同
ArrayList自由性較低,因為它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創(chuàng)建,然后添加數(shù)據(jù),通過調用下標進行使用;而LinkedList自由性較高,能夠動態(tài)的隨數(shù)據(jù)量的變化而變化,但是它不便于使用。
ArrayList的速度是要優(yōu)于LinkedList的。
在百萬級數(shù)據(jù)以下其實ArrayList的增刪速度實際上還是要優(yōu)于LinkedList的,百萬級數(shù)據(jù)以上如果還是向后追加的話,ArrayList速度還是要優(yōu)于LinkedList速度的。
ArrayList底層是數(shù)組,在每次進行添加的時候實際上是在數(shù)組后面進行追加,在調用擴容機制grow,數(shù)組復制的時候,用到的語句底層是用C語言進行書寫的,所以對效率的影響可以忽略不計(C語言執(zhí)行效率較高)。而LinkedList在添加的時候是在創(chuàng)建對象。
ArrayList在查詢的時候,實際上就是根據(jù)數(shù)組下標來獲取值,而LinkedList是前后迭代式獲取值,故ArrayList的查詢速度是優(yōu)于LinkedList的
1、數(shù)據(jù)結構不同
ArrayList是Array(動態(tài)數(shù)組)的數(shù)據(jù)結構,LinkedList是Link(鏈表)雙向鏈表的數(shù)據(jù)結構。
2、空間靈活性
ArrayList其實最好需要指定初始容量的(當然有些程序員為了偷懶,根本不會去初始化,這其實對于代碼質量低的項目而言是無關緊要的)《1.其實在代碼規(guī)范里,都要手動設置,只是我們用默認而已,如果公司用一些代碼規(guī)范的工具來做代碼質量,會要求寫上的 2.如果只是產品達到一定的量,初始容量還是有好處的》
LinkedList是比ArrayList靈活的,是根本不需要指定初始容量的
3、從線程安全性來講:ArrayList是線程不安全的,而LinkedList是線程安全的。
4、效率不同
當隨機訪問List(get和set操作)時,ArrayList比LinkedList的效率更高,因為LinkedList是線性的數(shù)據(jù)存儲方式,所以需要移動指針從前往后依次查找。ArrayList對于數(shù)據(jù)查詢非常快,但是插入與刪除元素比較慢;當對數(shù)據(jù)進行增加和刪除的操作(add和remove操作)時,LinkedList是恰好相反的,它的查詢速度非常慢,但是插入與刪除元素的速度非常快。
5、主要控件開銷不同
ArrayList主要控件開銷在于需要在lList列表預留一定空間;而LinkList主要控件開銷在于需要存儲節(jié)點信息以及節(jié)點指針。
linkedlist是單夕數(shù)。而linklist是雙夕數(shù)。
LinkedList和ArrayList是Java中常見的兩種數(shù)據(jù)結構,它們的區(qū)別如下:1. 數(shù)據(jù)存儲方式:ArrayList內部使用動態(tài)數(shù)組來存儲元素,LinkedList則是使用雙向循環(huán)鏈表來存儲元素。2. 訪問元素效率:由于ArrayList是基于數(shù)組實現(xiàn)的,所以隨機訪問元素的速度很快,時間復雜度為O(1),而LinkedList則需要從頭遍歷到指定的位置,時間復雜度為O(n)。3. 插入、刪除效率:LinkedList在插入和刪除元素時效率更高,因為只需要改變一些指針的指向,而ArrayList則需要在插入和刪除元素時涉及到數(shù)組的移動,時間復雜度為O(n)。4. 內存空間:由于ArrayList是基于數(shù)組存儲,所以需要預分配一定的內存空間,而LinkedList則沒有此限制,可以根據(jù)實際需要動態(tài)分配內存空間。5. 實現(xiàn)接口:ArrayList實現(xiàn)了List接口和RandomAccess接口,可以支持隨機訪問,而LinkedList則只實現(xiàn)了List接口,不支持RandomAccess接口。因此,在選擇數(shù)據(jù)結構時,應根據(jù)實際的需求來選擇合適的數(shù)據(jù)結構。如果需要經(jīng)常進行隨機訪問操作,建議使用ArrayList;如果需要頻繁進行元素的插入和刪除操作,建議使用LinkedList。
(1)、數(shù)據(jù)結構不同
ArrayList是Array(動態(tài)數(shù)組)的數(shù)據(jù)結構,LinkedList是Link(鏈表)的數(shù)據(jù)結構。
(2)、效率不同
當隨機訪問List(get和set操作)時,ArrayList比LinkedList的效率更高,因為LinkedList是線性的數(shù)據(jù)存儲方式,所以需要移動指針從前往后依次查找,重新排序。
(3)自由性不同
ArrayList自由性較低,因為它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創(chuàng)建,然后添加數(shù)據(jù),通過調用下標進行使用;而LinkedList自由性較高,能夠動態(tài)的隨數(shù)據(jù)量的變化而變化,但是它不便于使用。
(4)主要控件開銷不同
ArrayList主要控件開銷在于需要在lList列表預留一定空間;而LinkList主要控件開銷在于需要存儲節(jié)點信息以及節(jié)點指針。
ArrayList
1)只能裝入引用對象(基本類型要轉換為封裝類);
2)線程不安全;
3)底層由數(shù)組實現(xiàn)(順序表),因為由順序表實現(xiàn),所以會具備順序表的特點,如:需要聲明長度、超出長度時需要進行擴容、不適合頻繁的移動刪除元素、檢索元素快;
4)capacity默認為10,超出時,capacity自動增長0.5倍(oldCapacity >> 1)。
Vector:
1)只能裝入引用對象(基本類型要轉換為封裝類);
2)Vector通過synchronized方法保證線程安全;
3)底層也由數(shù)組實現(xiàn);
4)capacity默認為10(在構造方法中),超出時增長capacityIncrement的量,capacityIncrement小于等于0時,則增長1倍((capacityIncrement > 0) ? capacityIncrement : oldCapacity)。
LinkedList
1)只能裝入引用對象(基本類型會轉換為封裝類);
2)線程不安全;
3)底層實現(xiàn)為鏈表,具備鏈表的特點,如:不用聲明長度、檢索性能較差,但是插入移動刪除較快。
4)鏈表通過Node對象實現(xiàn)。
ArrayList
1)只能裝入引用對象(基本類型要轉換為封裝類);
2)線程不安全;
3)底層由數(shù)組實現(xiàn)(順序表),因為由順序表實現(xiàn),所以會具備順序表的特點,如:需要聲明長度、超出長度時需要進行擴容、不適合頻繁的移動刪除元素、檢索元素快;
4)capacity默認為10,超出時,capacity自動增長0.5倍(oldCapacity >> 1)。
Vector:
1)只能裝入引用對象(基本類型要轉換為封裝類);
2)Vector通過synchronized方法保證線程安全;
3)底層也由數(shù)組實現(xiàn);
4)capacity默認為10(在構造方法中),超出時增長capacityIncrement的量,capacityIncrement小于等于0時,則增長1倍((capacityIncrement > 0) ? capacityIncrement : oldCapacity)。
LinkedList
1)只能裝入引用對象(基本類型會轉換為封裝類);
2)線程不安全;
3)底層實現(xiàn)為鏈表,具備鏈表的特點,如:不用聲明長度、檢索性能較差,但是插入移動刪除較快。
4)鏈表通過Node對象實現(xiàn)。
ArrayList,與LinkedList都是屬于實現(xiàn)了List接口的類。首先從名字前綴開始看 ,Array表示數(shù)組,Link表示鏈表。
所以ArrayList底層是基于動態(tài)數(shù)組的。而LinkedList底層是基于雙向鏈表的。
ArrayList必須是連續(xù)內存的,而LinkedList不要求連續(xù)內存。
ArrayList查詢快,增加和刪除慢;LinkedList增加和刪除快,查詢慢。
ArrayList 底層為動態(tài)數(shù)組,所以查詢時是直接通過訪問下標,查詢效率高。而增加而刪除時,為了保證內存的連續(xù),增加和刪除某一位置后,后方元素都得向前移動一位,
最壞情況就是刪除第一個元素,則后面第2個到第n個元素都得往前移動一位。所以增加刪除慢。
LinkedList底層為雙向鏈表,不必保證內存上的連續(xù),所以增刪快,而查詢時必須要經(jīng)歷從頭到尾的遍歷,所以查詢慢。
為什么說ArrayList是基于動態(tài)數(shù)組呢?一般的數(shù)組,容量確定了就不可以再更改,也無法超過。但是ArrayList可以,
例如當數(shù)組元素數(shù)已滿時調用了add方法向尾部添加一個元素,則此時會進行擴容,ArrayList會自動創(chuàng)建一個更大的數(shù)組,并將所有元素拷貝到新數(shù)組中,而原數(shù)組會被拋棄,
會被GC回收。擴容后新數(shù)組的容量為原來的1.5倍。