一位同學(xué)內(nèi)推,幫我爭(zhēng)取到了58趕集面試的機(jī)會(huì)关斜。沒有筆試示括,直接進(jìn)入技術(shù)面。遇到一位工作五年的工程師翟痢畜,一臉嚴(yán)肅的把我?guī)У紸區(qū)四層的一個(gè)小方桌前垛膝。對(duì)于只有一年工作經(jīng)驗(yàn)的我,小有壓力丁稀。
上來(lái)自我介紹吼拥,談?wù)勛鲞^的項(xiàng)目,只要你思路清楚线衫,表達(dá)準(zhǔn)確就沒什么問題凿可。一般你做的項(xiàng)目和面試的項(xiàng)目也不會(huì)有太大相關(guān),就是看看你的思路授账。下面討論一個(gè)令我費(fèi)解的問題:
(1)談?wù)凧ava容器的線程安全與非線程安全枯跑?
第一,可以談?wù)勀男┦蔷€程安全的容器白热,哪些非線程安全的容器敛助。ArrayList是非線程安全的,Vector是線程安全的棘捣;HashMap是非線程安全的辜腺,HashTable是線程安全的;StringBuilder是非線程安全的乍恐,StringBuffer是線程安全的评疗。
第二,線程安全有什么好處茵烈,有什么壞處百匆。線程安全即在多線程操作同一個(gè)Vector或HashTable對(duì)象時(shí)不會(huì)有任何問題。但是線程安全必須要使用很多synchronized關(guān)鍵字來(lái)同步控制呜投,所以必然會(huì)導(dǎo)致性能的降低加匈。Java后續(xù)版本出才出現(xiàn)了眾多非線程安全的容器。
第三仑荐,安全與性能如何取舍雕拼。如果是多個(gè)線程操作同一個(gè)對(duì)象,那么使用線程安全的Vector粘招;否則啥寇,就使用效率更高的ArrayList。
第四,補(bǔ)充說明辑甜,非線程安全!=不安全衰絮。有人在使用過程中有一個(gè)不正確的觀點(diǎn):我的程序是多線程的,不能使用ArrayList要使用Vector磷醋,這樣才安全猫牡。非線程安全并不是多線程環(huán)境下就不能使用。注意我上面有說到:多線程操作同一個(gè)對(duì)象邓线。注意是同一個(gè)對(duì)象淌友。如果是每個(gè)線程中new一個(gè)ArrayList,而這個(gè)ArrayList只在這一個(gè)線程中使用骇陈,那么肯定是沒問題的亩进。
多個(gè)線程操作同一個(gè)對(duì)象的測(cè)試代碼:
(2)談?wù)凧ava容器類的數(shù)據(jù)結(jié)構(gòu)?
第一缩歪、談?wù)凧ava容器類的框架圖,如果你能夠畫出來(lái)的話谍憔,對(duì)方肯定會(huì)暗自佩服你的邏輯匪蝙。
如圖所示:
①集合接口:6個(gè)接口(短虛線表示),表示不同集合類型习贫,是集合框架的基礎(chǔ)逛球。
②抽象類:5個(gè)抽象類(長(zhǎng)虛線表示),對(duì)集合接口的部分實(shí)現(xiàn)苫昌,可擴(kuò)展為自定義集合類颤绕。
③實(shí)現(xiàn)類:8個(gè)實(shí)現(xiàn)類(實(shí)線表示),對(duì)接口的具體實(shí)現(xiàn)祟身。
接口詳解:
· Collection 接口是一組允許重復(fù)的對(duì)象奥务。
· Set 接口繼承 Collection,但不允許重復(fù)袜硫。使用自己內(nèi)部的一個(gè)排列機(jī)制氯葬。
· List 接口繼承 Collection,允許重復(fù)婉陷,以元素插人的次序來(lái)放置元素帚称。不會(huì)重新排列。
· Map接口是一組成對(duì)的鍵-值對(duì)象秽澳,即所持有的是key-value pairs闯睹。Map中不能有重復(fù)的
key。擁有自己的內(nèi)部排列機(jī)制担神。
第二楼吃,談?wù)劸唧w的實(shí)現(xiàn)機(jī)制,
1. Set子接口:無(wú)序,不允許重復(fù)所刀。List子接口:有序衙荐,可以有重復(fù)元素。具體區(qū)別是:
Set:檢索元素效率低下浮创,刪除和插入效率高忧吟,插入和刪除不會(huì)引起元素位置改變。<對(duì)應(yīng)類有 HashSet,TreeSet>
List:和數(shù)組類似斩披,List可以動(dòng)態(tài)增長(zhǎng)溜族,查找元素效率高,插入刪除元素效率低垦沉,因?yàn)闀?huì)引起其他元素位置改變煌抒。<相應(yīng)類有 ArrayList,LinkedList,Vector>
2. 實(shí)例比較
HashSet:以哈希表的形式存放元素厕倍,插入刪除速度很快寡壮。TreeSet:以二叉樹的形式存放元素。
ArrayList:動(dòng)態(tài)數(shù)組讹弯,LinkedList:鏈表况既、隊(duì)列、堆棧组民。
Vector是一種老的動(dòng)態(tài)數(shù)組棒仍,是線程同步的,效率很低臭胜,一般不贊成使用莫其。
關(guān)注一下吧,讓我們一起在coding的路上果奔吧K嗜B叶浮!
學(xué)習(xí)Java的同學(xué)注意了R亲场5叭臁!
學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話睛驳,歡迎加入Java學(xué)習(xí)交流群346942462烙心,我們一起學(xué)Java!