偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

談?wù)凙rrayList、Vector和LinkedList 的存儲(chǔ)性能及特性

開(kāi)發(fā) 前端
面試官請(qǐng)你談?wù)凙rrayList、Vector和LinkedList 的存儲(chǔ)性能及特性。今天我給大家分享一下我對(duì)這個(gè)問(wèn)題的理解。

? 又有一位工作2年的小伙伴面試的時(shí)候,被問(wèn)到一個(gè)集合相關(guān)的問(wèn)題。說(shuō)請(qǐng)你談?wù)凙rrayList、Vector和LinkedList 的存儲(chǔ)性能及特性。

今天呢,我給大家分享一下我對(duì)這個(gè)問(wèn)題的理解。

?1、存儲(chǔ)性能及特性

關(guān)于ArrayList、Vector和LinkedList 的存性能理及特性,我從以下3個(gè)方面來(lái)分析:

圖片

(1)首先,ArrayList 和 Vector 的底層都是采用數(shù)組的來(lái)存儲(chǔ)數(shù)據(jù),而且都是根據(jù)索引來(lái)取數(shù)據(jù),這樣設(shè)計(jì)使得獲取數(shù)據(jù)快而插入數(shù)據(jù)慢。另外,每次擴(kuò)容都要移動(dòng)數(shù)組中的元素,存儲(chǔ)數(shù)據(jù)量較大的時(shí)候會(huì)影響讀寫(xiě)性能。

圖片

(2)其次,由于Vector 中的方法都使用了 synchronized 修飾,因此 ,Vector 中對(duì)數(shù)據(jù)操作都是線程安全的,但性能上比ArrayList 差。

圖片

(3)然后,LinkedList 的底層是采用雙向鏈表來(lái)存儲(chǔ)數(shù)據(jù)的,也就是說(shuō)將內(nèi)存中零散的內(nèi)存單元通過(guò)附加的引用關(guān)聯(lián)起來(lái),形成一個(gè)可以按序號(hào)索引的線性結(jié)構(gòu),這種鏈?zhǔn)酱鎯?chǔ)方式與數(shù)組的連續(xù)存儲(chǔ)方式相比,內(nèi)存的利用率更高。LinkedList獲取數(shù)據(jù)需要根據(jù)索引序號(hào),向前或者向后遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以,LinkedList插入數(shù)據(jù)的速度更快。

圖片

(4)最后,再補(bǔ)充一點(diǎn),Vector是Java 早期的版本中提供的容器, 屬于遺留容器,官方已經(jīng)不再推薦使用。但是由于 ArrayList 和 LinkedListed 都是非線程安全的,在多線程環(huán)境下,可以使用工具類(lèi)Collections 的 synchronizedList() 方法,將容器轉(zhuǎn)換成線程安全的容器再使用。這其實(shí)也是裝飾器模式的一種應(yīng)用。

2、關(guān)于遺留容器

關(guān)于Java中的遺留容器,我最后再補(bǔ)充一下。除Vector之外,還有Hashtable、Dictionary、BitSet、Stack、Properties都是遺留容器,這些容器中,Properties 類(lèi)存在比較嚴(yán)重的設(shè)計(jì)缺陷。來(lái)看這段源碼:

/* Since : JDK1.0 See Also : native2ascii tool for Solaris, native2ascii tool for Windows Author : Arthur van Hoff, Michael McCloskey, Xueming Shen */ public class Properties extends Hashtable<Object,Object> { }

Properties是一個(gè)鍵和值都是字符串的特殊的鍵值對(duì)映射,在設(shè)計(jì)上應(yīng)該是關(guān)聯(lián)一個(gè)Hashtable,并將它的兩個(gè)泛型參數(shù)設(shè)置為 String 類(lèi)型,但是 Java API 中的Properties是直接繼承了 Hashtable,這很明顯是對(duì)繼承的濫用。主要體現(xiàn)在以下兩個(gè)方面:

圖片

(1)首先,根據(jù)合成復(fù)用原則,這里Properties 和Hashtable的代碼復(fù)用關(guān)系應(yīng)該是 Has-A 關(guān)系,而不是 Is-A 關(guān)系。

(2)另一方面,這兩個(gè)容器都屬于工具類(lèi),繼承工具類(lèi)本身就是一個(gè)錯(cuò)誤的做法,使用工具類(lèi)最好的方式是 Has-A 關(guān)系(關(guān)聯(lián))或Use-A 關(guān)系(依賴)。

既然都講到這里了,最后再擴(kuò)展一下Stack 類(lèi)在設(shè)計(jì)上也存在Properties同樣的缺陷。來(lái)看這樣一段源碼:

圖片

/* Since : JDK1.0 Author : Jonathan Payne */ public class Stack<E> extends Vector<E> { }

在JDK的util包中,我們發(fā)現(xiàn)Stack類(lèi)也是繼承了 Vector,這個(gè)設(shè)計(jì)也是不太合理的。

好了,以上就是我對(duì)ArrayList、Vector和LinkedList的理解。

責(zé)任編輯:姜華 來(lái)源: Tom彈架構(gòu)
相關(guān)推薦

2019-11-06 16:21:25

ArrayListLinkedListVector

2011-05-26 14:49:53

ArrayListLinkedList

2023-05-16 07:39:15

ArrayList磁盤(pán)IO

2021-07-11 09:34:45

ArrayListLinkedList

2021-10-12 16:46:59

ArrayList接口LinkedList

2024-10-05 00:00:15

ArrayList性能Java

2012-04-16 15:08:33

2021-07-08 10:00:59

LinkedLis集合定義

2012-02-22 14:14:43

Java

2020-07-30 07:30:17

存儲(chǔ)技術(shù)數(shù)據(jù)

2021-10-09 20:13:03

ArrayListLinkedList java

2009-10-10 15:36:45

布線系統(tǒng)性能

2018-09-29 15:34:34

JavaList接口

2017-08-03 17:30:51

IBM存儲(chǔ)IBM存儲(chǔ)

2012-05-03 15:01:24

數(shù)值壓縮

2015-12-18 10:53:15

Linux網(wǎng)絡(luò)特性性能

2010-03-16 15:36:32

網(wǎng)絡(luò)交換機(jī)

2021-01-12 08:20:51

AndroidActivity系統(tǒng)

2023-06-01 08:19:19

ArrayListVector多線程

2016-01-28 18:25:25

戴爾云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)