1.Collections.sort排序內(nèi)部原理
在Java6Arrays.sort()和Collections.sort()中使用MergeSort,在Java7中,內(nèi)部實(shí)現(xiàn)被TimSort代替,這需要對(duì)對(duì)象之間的比較進(jìn)行更嚴(yán)格的實(shí)現(xiàn)
2.HashMap原理,java8所做的更改
在結(jié)構(gòu)實(shí)現(xiàn)方面,HashMap是通過(guò)數(shù)組+鏈表+紅黑樹(shù)(JDK1.8添加了紅黑樹(shù)部分)實(shí)現(xiàn)的。HashMap僅允許一個(gè)記錄的鍵最多為空,而允許多個(gè)記錄的值為空。HashMap不是線程安全的。ConcurrentHashMap是線程安全的。解決沖突:發(fā)生沖突時(shí),請(qǐng)使用zipper方法在單鏈接列表中鏈接其關(guān)鍵字為同義詞的節(jié)點(diǎn)。哈希表的長(zhǎng)度為m,定義了一個(gè)由m個(gè)頭指針組成的指針數(shù)組T,并將地址為i的節(jié)點(diǎn)插入到以T(i)作為頭指針的單鏈表中。在Java8中,沖突元素超出了限制(8),并且鏈表被一棵紅黑樹(shù)取代。
3.String和StringBuilder之間的區(qū)別
1)可變且不可變:字符串不可變,并且每次執(zhí)行“+”時(shí)都會(huì)生成一個(gè)新對(duì)象。因此,在頻繁更改字符串以節(jié)省內(nèi)存的情況下,不使用String。
2)是否是多線程安全的:StringBuilder不會(huì)向該方法添加同步鎖,因此它不是線程安全的。StringBuffer和String都是線程安全的。
4.向量和數(shù)組的區(qū)別
1)當(dāng)內(nèi)存不足時(shí),默認(rèn)情況下ArrayList擴(kuò)展50%+1,默認(rèn)情況下Vector擴(kuò)展1倍。
2)Vector屬于線程安全級(jí)別,但是在大多數(shù)情況下,由于線程安全需要更大的系統(tǒng)開(kāi)銷,因此不使用Vector。
5.HashMap和Hashtable之間的區(qū)別
1)歷史原因:Hashtable繼承了Dictonary類,HashMap繼承了abstractMap
2)HashMap允許空鍵/值對(duì),但最多只能有一個(gè)空對(duì)象,而HashTable則不允許。
3)HashTable已同步,而HashMap未同步,這比HashTable更有效
6.ConncurrentHashMap和哈希表比較(兩個(gè)線程同時(shí)訪問(wèn)映射中的同一鏈,一個(gè)線程在尾部刪除,一個(gè)線程遍歷并在前面找到它。請(qǐng)問(wèn)為什么上一個(gè)線程可以正確地找到被刪除的節(jié)點(diǎn)另一個(gè)線程稍后)
ConcurrentHashMap結(jié)合了hashtable和hashmap的優(yōu)點(diǎn)。Hashtable是同步的,即線程安全的,并且hashmap不考慮同步。因此,哈希映射在單線程情況下更為有效。在哈希表有多個(gè)線程的情況下,同步操作可以確保程序執(zhí)行的正確性。但是哈希表正在阻塞,并且每次同步執(zhí)行時(shí)都必須鎖定整個(gè)結(jié)構(gòu)。ConcurrentHashMap誕生是為了解決這個(gè)問(wèn)題。
ConcurrentHashMap允許同時(shí)執(zhí)行多個(gè)修改操作。關(guān)鍵在于使用鎖分離技術(shù)(一個(gè)數(shù)組保存多個(gè)對(duì)象,這些對(duì)象的鎖用作單獨(dú)的鎖,并且在獲取/放置時(shí)隨機(jī)使用任何一個(gè))。它使用多個(gè)鎖來(lái)控制哈希表不同部分的修改。在JDK1.6中,有一個(gè)HashEntry結(jié)構(gòu)。每次插入新添加的節(jié)點(diǎn)作為鏈的頭節(jié)點(diǎn)(使用HashMap實(shí)現(xiàn)),并且每次刪除節(jié)點(diǎn)時(shí),在刪除的節(jié)點(diǎn)之前的所有節(jié)點(diǎn)的副本將形成一個(gè)新鏈,并指向當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),因此刪除后有兩個(gè)鏈,因此可以確保即使在同一鏈中,一個(gè)線程也要?jiǎng)h除,而另一個(gè)線程遍歷,它們都工作良好,因?yàn)楸闅v的線程可以繼續(xù)使用原始鏈。
在Java8中,易失性HashEntry用于存儲(chǔ)數(shù)據(jù),而表元素用作鎖。從表數(shù)組+單鏈列表中添加了紅黑樹(shù)。紅黑樹(shù)是一種特殊的二叉搜索樹(shù),具有以下特征:1.節(jié)點(diǎn)為紅色或黑色2.根節(jié)點(diǎn)為黑色3.葉節(jié)點(diǎn)為黑色4.一個(gè)節(jié)點(diǎn)為紅色,然后葉節(jié)點(diǎn)為黑色5。一個(gè)從一個(gè)節(jié)點(diǎn)到其子孫的所有路徑上的黑色節(jié)點(diǎn)數(shù)相同。
更多面試題及答案:https://www.jianshu.com/p/ce1fb8497883
列表和集合比較,各自子類的比較
比較1:比較Arraylist和LinkedList
1.ArrayList實(shí)現(xiàn)基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),因?yàn)榈刂肥沁B續(xù)的,所以一旦存儲(chǔ)了數(shù)據(jù),查詢操作效率就會(huì)更高(它們被放置在內(nèi)存中)。
2.由于地址是連續(xù)的,因此ArrayList需要移動(dòng)數(shù)據(jù),因此插入和刪除操作的效率較低。
3.LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。該地址是任意的,因此在打開(kāi)存儲(chǔ)空間時(shí)無(wú)需等待連續(xù)地址。對(duì)于添加和刪除操作,LinedList更具優(yōu)勢(shì)。
4.由于LinkedList需要移動(dòng)指針,因此查詢操作性能較低。
應(yīng)用場(chǎng)景分析:
當(dāng)需要訪問(wèn)數(shù)據(jù)時(shí),使用ArrayList;當(dāng)需要多次添加和刪除數(shù)據(jù)時(shí),使用LinkedList。
比較2:ArrayList和Vector的比較
1.向量方法都是同步且線程安全的,而ArrayList方法則不是,因?yàn)榫€程同步將不可避免地影響性能。因此,ArrayList的性能優(yōu)于Vector。
2.當(dāng)Vector或ArrayList中的元素超過(guò)其初始大小時(shí),Vector會(huì)將其容量加倍,而ArrayList僅將其大小增加50%,因此。ArrayList有利于節(jié)省內(nèi)存空間。
3.在大多數(shù)情況下不使用Vector,因?yàn)樗男阅懿缓茫撬С志€程同步,也就是說(shuō),一次只能有一個(gè)線程可以寫(xiě)入Vector,以避免由于多個(gè)線程同時(shí)寫(xiě)入而導(dǎo)致的不一致。
4.向量可以設(shè)置增長(zhǎng)因子,但是ArrayList不能。
應(yīng)用場(chǎng)景分析:
1.向量是線程同步的,因此它也是線程安全的,而ArrayList是線程異步的并且是不安全的。如果不考慮線程安全性,則ArrayList通常更有效。
2.如果集合中元素的數(shù)量大于當(dāng)前集合數(shù)組的長(zhǎng)度,則在集合中使用相對(duì)大量的數(shù)據(jù)比使用Vector具有某些優(yōu)勢(shì)。
比較3:HashSet和TreeSet的比較
1.TreeSet由二叉樹(shù)實(shí)現(xiàn)。Treeset中的數(shù)據(jù)會(huì)自動(dòng)排序,并且不允許使用null值。
2.HashSet由哈希表實(shí)現(xiàn)。HashSet中的數(shù)據(jù)是無(wú)序的,可以放入null,但是只能放入一個(gè)null,并且不能重復(fù)兩個(gè)中的值,就像數(shù)據(jù)庫(kù)中的唯一約束一樣。
3.HashSet要求放入的對(duì)象必須實(shí)現(xiàn)HashCode()方法。放置對(duì)象由哈希碼標(biāo)識(shí),對(duì)于內(nèi)容相同的String對(duì)象,哈希碼相同,因此無(wú)法重復(fù)內(nèi)容。但是同一類的對(duì)象可以放在不同的實(shí)例中。
應(yīng)用場(chǎng)景分析:
HashSet是基于Hash算法實(shí)現(xiàn)的,其性能通常優(yōu)于TreeSet。我們通常應(yīng)該使用HashSet,僅在需要排序功能時(shí)才使用TreeSet。
HashMap和ConcurrentHashMap之間的區(qū)別
1.HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。
2.ConcurrentHashMap使用鎖分段技術(shù)對(duì)整個(gè)哈希桶進(jìn)行分段,即將這個(gè)大數(shù)組劃分為幾個(gè)小段,每個(gè)小段都有一個(gè)鎖,然后在插入元素時(shí),您需要找到哪個(gè)段應(yīng)該是插入,然后將其插入到此段上,在這里您需要獲取段鎖。
3.ConcurrentHashMap使鎖的粒度更細(xì),并發(fā)性能更好。
HashTable和ConcurrentHashMap之間的區(qū)別
它們都可以在多線程環(huán)境中使用,但是當(dāng)Hashtable的大小增加到一定程度時(shí),性能將急劇下降,因?yàn)樵诘^(guò)程中需要長(zhǎng)時(shí)間鎖定它。因?yàn)镃oncurrentHashMap引入了分段,所以無(wú)論分段有多大,它都只需要鎖定地圖的特定部分,其他線程不需要等待迭代完成就可以訪問(wèn)地圖。簡(jiǎn)而言之,在迭代過(guò)程中,ConcurrentHashMap僅鎖定地圖的特定部分,而Hashtable鎖定整個(gè)地圖。
String,StringBuffer和StringBuilder之間的區(qū)別
1.在這方面,運(yùn)行速度或執(zhí)行速度:StringBuilder>StringBuffer>String。
2.就線程安全而言,StringBuilder是線程不安全的,而StringBuffer是線程安全的。
應(yīng)用場(chǎng)景分析:
字符串:適用于少量的字符串操作
StringBuilder:適用于單個(gè)線程下字符緩沖區(qū)中的大量操作
StringBuffer:適用于多線程下字符緩沖區(qū)中的大量操作
更多面試題及答案:https://blog.csdn.net/zoucanfa/article/details/79559869
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹(shù)莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)