2018-11-26 java 面試(集合)

Java中的幾種集合的區(qū)別及適用場(chǎng)景

首先大的集合分為:List,Set,Map三種,其中List與Set是繼承自Collection,而Map不是。

List與Set的區(qū)別:List中的元素有存放順序,并且可以存放重復(fù)元素,檢索效率高,插入刪除效率低,Set沒(méi)有存放順序,而且不可以存放重復(fù)元素,后來(lái)的元素會(huì)把前面重復(fù)的元素替換掉,檢索效率低,插入刪除效率高。(Set存儲(chǔ)位置是由它的HashCode碼決定的,所以它存儲(chǔ)的對(duì)象必須有equals()方法,而且Set遍歷只能用迭代,因?yàn)樗鼪](méi)有下標(biāo)。)

1、最常用的集合:ArrayList

特點(diǎn):ArrayList集合中元素存儲(chǔ)的位置是連續(xù)的,所以查詢起來(lái)會(huì)比較快捷,但是執(zhí)行插入刪除操作會(huì)比較麻煩一點(diǎn),會(huì)引起其他元素位置的變化。

注意:list中存儲(chǔ)的是對(duì)象的引用,而不是對(duì)象本身。

2、與最常用集合相反的集合:LinkedList

LinkedList與ArrayList是互補(bǔ)的,所以ArrayList的優(yōu)點(diǎn)就是LinkedList的缺點(diǎn),ArrayList的缺點(diǎn)就是LinkedList的優(yōu)點(diǎn)。

特點(diǎn):LinkedList中元素位置是任意的,所以執(zhí)行插入刪除操作效率較高,查詢效率較低。

3、與一般集合都相反的集合:Vector

為什么說(shuō)它與一般集合都相反呢?因?yàn)樗且环N老的動(dòng)態(tài)數(shù)組,很多方法都用synchonized修飾,所以它是線程安全得,而一般集合是線程不安全得。

特點(diǎn):多個(gè)線程同時(shí)訪問(wèn)不會(huì)發(fā)生不確定的結(jié)果,但是它的效率會(huì)比較低,如果要考慮線程安全的話可以用它。

4、Set中最常用的集合:HashSet

在用Set集合的時(shí)候我?guī)缀跤玫亩际荋ashSet,HashSet是使用Hash表實(shí)現(xiàn)的,集合里面的元素是無(wú)序得,可以有null值,但是不能有重復(fù)元素。

特點(diǎn):因?yàn)橄嗤脑鼐哂邢嗤膆ashCode,所以不能有重復(fù)元素

5、Set中第二常用的集合:TreeSet

TreeSet是用二叉樹(shù)結(jié)構(gòu)實(shí)現(xiàn)的集合

特點(diǎn):集合中的元素是有順序得,不允許放入null,同樣不能放入重復(fù)元素。

6、第二常用的集合:HashMap

經(jīng)常遇到需要使用鍵值對(duì)存儲(chǔ)的場(chǎng)景,而HashMap是用得最多的一種鍵值對(duì)存儲(chǔ)的集合。

特點(diǎn):HashMap允許空鍵值,并且它是非線程安全的,所以插入、刪除和定位元素會(huì)比較快。

7、一些不太常用的Map集合:TreeMap,HashTable

TreeMap是基于紅黑樹(shù)實(shí)現(xiàn)的,適用于按自然順序火茲定于順序遍歷key。

HashTable是基于HashCode實(shí)現(xiàn)的,但它是線程安全的,所以會(huì)比HashMap效率低,而且不允許null值。



HashMap的主干是一個(gè)Entry數(shù)組。Entry是HashMap的基本組成單元,每一個(gè)Entry包含一個(gè)key-value鍵值對(duì)。

HashMap和Hashtable區(qū)別?

1.HashMap支持null Key和null Value;Hashtable不允許。這是因?yàn)镠ashMap對(duì)null進(jìn)行了特殊處理,將null的hashCode值定為了0,從而將其存放在哈希表的第0個(gè)bucket。

2.HashMap是非線程安全,HashMap實(shí)現(xiàn)線程安全方法為Map map = Collections.synchronziedMap(new HashMap());Hashtable是線程安全

3.ArrayList和LinkedList對(duì)比

ArrayList和Vector使用了數(shù)組的實(shí)現(xiàn),可以認(rèn)為ArrayList或者Vector封裝了對(duì)內(nèi)部數(shù)組的操作,比如向數(shù)組中添加,刪除,插入新的元素或者數(shù)據(jù)的擴(kuò)展和重定向。

LinkedList使用了循環(huán)雙向鏈表數(shù)據(jù)結(jié)構(gòu)。與基于數(shù)組ArrayList相比,這是兩種截然不同的實(shí)現(xiàn)技術(shù),這也決定了它們將適用于完全不同的工作場(chǎng)景。

2? HashMap

HashMap的主干是一個(gè)Entry數(shù)組。Entry是HashMap的基本組成單元,每一個(gè)Entry包含一個(gè)key-value鍵值對(duì)。


HashMap和Hashtable區(qū)別?


1.HashMap支持null Key和null Value;Hashtable不允許。這是因?yàn)镠ashMap對(duì)null進(jìn)行了特殊處理,將null的hashCode值定為了0,從而將其存放在哈希表的第0個(gè)bucket。


2.HashMap是非線程安全,HashMap實(shí)現(xiàn)線程安全方法為Map map = Collections.synchronziedMap(new HashMap());Hashtable是線程安全


3.ArrayList和LinkedList對(duì)比


ArrayList和Vector使用了數(shù)組的實(shí)現(xiàn),可以認(rèn)為ArrayList或者Vector封裝了對(duì)內(nèi)部數(shù)組的操作,比如向數(shù)組中添加,刪除,插入新的元素或者數(shù)據(jù)的擴(kuò)展和重定向。


LinkedList使用了循環(huán)雙向鏈表數(shù)據(jù)結(jié)構(gòu)。與基于數(shù)組ArrayList相比,這是兩種截然不同的實(shí)現(xiàn)技術(shù),這也決定了它們將適用于完全不同的工作場(chǎng)景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容