天天看點

ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面

作者:Tom彈架構

ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。

又有一位工作兩年的小夥伴在面試的時候被問到集合相關的問題說請你談一談ArrayList和LinkedList的存儲性能和特性。今天我給大家分享一下我對這個問題的了解。當ArrayList的文字版已經整理在20萬字的文檔裡面了,有需要的小夥伴可以在評論區領取。

關于ArrayList和LinkedList的存儲性能和特性從以下3個方面給大家分析。

·首先ArrayList和Vector的底層是采用資料來存儲資料的,而且都是根據索引來擷取資料,這樣的設計使得擷取資料快,而插入資料比較慢,另外在每一次擴容的時候都要移動數組中的元素,當存儲的資料量加大的時候就會影響讀寫性能。

·其次由于Vector中的方法都使用了synchronized修飾,是以Vector中對數組的操作都是線程全的,但是性能上比ArrayList要差一些。

·然後是LinkedList,它的底層是采用雙向清單來存儲資料的,也就是說它将記憶體中比較零散的記憶體單元通過一個附加的引用關聯起來,然後形成一個可以按序号索引的線性結構。這種鍊式的存儲方式和數組的連續存儲方式相比記憶體使用率更高一些。

LinkedList擷取資料的時候需要根據索引的序号向前或者向後來周遊,但是它插入資料的時候隻需要記錄本項的前後項就可以了,是以LinkedList插入資料的速度要更快一些。

·最後再補充一點,Vector是Java早期的版本中提供的容器,是以它是屬于一個遺留容器,官方已經不再推薦使用了。

但是由于ArrayList和LinkedListed都是非線程要全的,在多線程環境下可以使用工具類Collections的一個synchronizedList()方法來将容器轉換成線程要全的容器再來使用。這其實也是利用了裝飾器模式的一種應用。

·2關于遺留容器。關于Java中的遺留容器,最後再補充一下,除了Vector之外還有Hashtable和Falt,都是屬于遺留容器。

在這些容器中,JavaScript存在一個比較嚴重的設計缺陷。來看這一段源代碼。·····一錢是一個鍵和值,都是字元串的特殊的鍵值對映射,在設計上應該是關聯一個Hashtable,并且将它的兩個泛型參數設定為String類型。

·但是在JavaAPI中,Re是直接繼承了Hashtable,這很明顯是對繼承的泛濫。主要展現在以下兩個方面。

→首先根據合成複用原則,這裡的的Solar和Hashtable的代碼互用關系應該是Has-A關系,而不是Is-A的關系。

→另一方面,這兩個容器都是屬于工具類,繼承工具類本身是一個錯誤的做法,是以使用工具類最好的方式應該是Has-A的關系關聯關系,或者是Use-A的關系依賴關系。

·既然都講到這裡了,最後再擴充一下,Stack類在設計上也存在同樣的一個缺陷。來看這一段源代碼,在JDK的util包中發現Stack類也繼承Vector,這個設計也是不太合理的。

以上就是我對ArrayListVector和LinkedList的了解,我是被程式設計耽誤的文藝Tom。

如果我的分享對你有幫助,請你動動手指一鍵三連,分享給更多的人。

關注我,面試不再難!

ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面
ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面
ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面
ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面
ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面
ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面
ArrayList、Vector和LinkedList的存儲性能及特性。Java面試題解析。又有一位工作兩年的小夥伴在面

繼續閱讀