哪些可以免費(fèi)做網(wǎng)站推廣優(yōu)化關(guān)鍵詞
21. JVM是如何處理異常(大概流程)?
如果發(fā)生異常,方法會(huì)創(chuàng)建一個(gè)異常對(duì)象(包括:異常名稱(chēng)、異常描述以及異常發(fā)生時(shí)應(yīng)用程序的狀態(tài)),并轉(zhuǎn)交給JVM。創(chuàng)建異常對(duì)象,并轉(zhuǎn)交給JVM的過(guò)程稱(chēng)為拋出異常。
異常發(fā)生后,可能有一系列的方法調(diào)用,終才進(jìn)入拋出異常的方法,這一系列方法調(diào)用的有序列表叫做調(diào)用棧。
JVM會(huì)順著調(diào)用棧去查找看是否有可以處理異常的代碼,如果有,則調(diào)用異常處理代碼。如果沒(méi)有,JVM就會(huì)將該異常轉(zhuǎn)交給默認(rèn)的異常處理器(默認(rèn)處理器為JVM 的一部分),默認(rèn)異常處理器打印出異常信息并終止應(yīng)用程序。
22. 請(qǐng)聊一下java的集合類(lèi),以及在實(shí)際項(xiàng)目中你是如何用的?
- 注意說(shuō)出集合體系、常用類(lèi)、接口、實(shí)現(xiàn)類(lèi)。
- 高并發(fā)的集合類(lèi)、參照集合增強(qiáng)內(nèi)容。
- 在實(shí)際項(xiàng)目中引用。?
23. Java集合框架類(lèi)圖:
24. ArrayList與LinkedList的區(qū)別?
- ArrayList基于動(dòng)態(tài)數(shù)組(順序表)的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表(雙向鏈表)的數(shù)據(jù)結(jié)構(gòu);
- ArrayList隨機(jī)訪問(wèn)快,LinkedList隨機(jī)訪問(wèn)慢;
- ArrayList添加和刪除慢,LinkedList添加和刪除快;
- 此外,LinkedList還專(zhuān)門(mén)提供了操作表頭和表尾元素的方法,可當(dāng)做堆棧、隊(duì)列和雙向隊(duì)列使用。
25. ArrayList與Vector的區(qū)別?
- 相同:底層都是數(shù)組實(shí)現(xiàn)的;
- ArrayList不是線程安全,但是效率高,Vector是線程安全,效率低(源碼中方法用synchronized修飾);
- ArrayList和Vector都采用線性連續(xù)存儲(chǔ)空間,默認(rèn)容量大小都為10;存儲(chǔ)空間不足時(shí),ArrayList默認(rèn)1.5倍擴(kuò)容 ,Vector默認(rèn)1倍擴(kuò)容;
- ArrayList可以通過(guò)Collections.synchronizedList(List list) 實(shí)現(xiàn)線程同步的集合。
- 注:Vector是java的遺留框架,遺留框架設(shè)計(jì)上存在問(wèn)題,已經(jīng)不再使用。遺留框架還有Hashtable、Dictionary、BitSet、Stack、Properties、Enumeration。
26. HashMap和Hashtable的區(qū)別?
- HashMap是非同步,非安全線程,但速度快;Hashtable是同步,安全線程,但速度慢。
- HashMap可以接受null值( key和value都可為空);Hashtable不可以。
- HashMap默認(rèn)容量大小是16;Hashtable默認(rèn)容量大小是11。
- HashMap的hash值重新計(jì)算過(guò),Hashtable直接使用hashCode。
- HashMap繼承自AbstractMap類(lèi),Hashtable繼承自Dictionary類(lèi)
27. HashMap在1.8中做了哪些優(yōu)化?
- 數(shù)據(jù)結(jié)構(gòu) --> 數(shù)組 + 鏈表 + 紅黑樹(shù)
- hash函數(shù) --> 高16參與Hash,降低Hash沖突
- 擴(kuò)容優(yōu)化 --> 擴(kuò)容時(shí)元素不需要進(jìn)行重新計(jì)算位置。新位置 = 原位置 + 原數(shù)組長(zhǎng)度
28. HashMap線程安全的方式?
HashMap不是線程安全的。
- 方法一:通過(guò)Collections.synchronizedMap()
- 方法二:使用ConcurrentHashMap
29. HashMap為什么擴(kuò)容是兩倍?
- 將取模轉(zhuǎn)為位運(yùn)算操作,提高運(yùn)算效率,只有2的冪次方成立 -> (n-1)&hash
- 并且在容量是2的冪次方時(shí),n-1的二進(jìn)制會(huì)全為1,位運(yùn)算時(shí)可以充分散列,避免不必要的哈希沖突。
30. HashMap為什么要使用紅黑樹(shù)?
- 紅黑樹(shù)是動(dòng)態(tài)平衡的一棵二叉查找樹(shù),可以加速查找。
- HashMap什么時(shí)候轉(zhuǎn)換紅黑樹(shù)(數(shù)組長(zhǎng)度大于64,索引節(jié)點(diǎn)位置元素個(gè)數(shù)大于8轉(zhuǎn)換)、什么時(shí)候轉(zhuǎn)換鏈表(索引位置元素個(gè)數(shù)等于6時(shí)轉(zhuǎn)換)。
- 說(shuō)一下向關(guān)聯(lián)的知識(shí)。
31. HashMap為什么用紅黑樹(shù)不用普通的AVL樹(shù)?
總:
AVL是高度平衡樹(shù),調(diào)整頻率高,適合查詢(xún)多,修改少的場(chǎng)景。紅黑樹(shù)是弱平衡樹(shù),調(diào)整頻率低,適合修改多場(chǎng)景。
AVL樹(shù):
AVL樹(shù)是高度平衡樹(shù),任何兩個(gè)左右子樹(shù)高度大于1時(shí),就好動(dòng)態(tài)調(diào)整到平衡。所以AVL樹(shù)適合用于插入與刪除次數(shù)比較少,但查找多的情況。
紅黑樹(shù):
它也是一種平衡二叉樹(shù),但每個(gè)節(jié)點(diǎn)帶顏色,可以是紅或黑。通過(guò)對(duì)任何一條從根到葉子的路徑上各個(gè)節(jié)點(diǎn)顏色的限制,確保沒(méi)有一條路徑會(huì)比其它路徑長(zhǎng)出兩倍,所以紅黑樹(shù)是一種弱平衡二叉樹(shù)。紅黑樹(shù)從根到葉子的最長(zhǎng)路徑不會(huì)超過(guò)最短路徑的2倍。
32. HashMap為什么在JDK 1.8之后不再有死循環(huán)的問(wèn)題?
JDK1.8以前,導(dǎo)致死循環(huán)的主要原因是擴(kuò)容后,節(jié)點(diǎn)的順序會(huì)反掉,可能會(huì)形成一個(gè)環(huán)形鏈。
原因:兩個(gè)線程同時(shí)調(diào)用了擴(kuò)容方法,擴(kuò)容同一索引位置。線程一執(zhí)行途中被掛起(Entry next = e.next;),線程二獲得執(zhí)行時(shí)間,執(zhí)行完擴(kuò)容操作,線程一再次獲得執(zhí)行時(shí)間,會(huì)形成環(huán)形鏈,然后調(diào)用HashTable.get()時(shí),出現(xiàn)了無(wú)限循環(huán)。
https://blog.csdn.net/huantai3334/article/details/104170984
33. 解決hash沖突的方式有哪些?
- 開(kāi)放定址法 --> ThreadLocal
- 鏈地址法 --> HashMap
- 再哈希法(又叫雙哈希):當(dāng)發(fā)生沖突時(shí),重新計(jì)算哈希計(jì)算地址,直到無(wú)沖突。會(huì)增加計(jì)算時(shí)間。
- 建立公共溢出區(qū):將哈希表分為基本表和溢出表兩部分,凡是和基本表發(fā)生沖突的元素,一律填入溢出表。
34.Queue接口:
單端隊(duì)列與雙端隊(duì)列:
- Queue與Deque
阻塞隊(duì)列與非阻塞隊(duì)列:
- 阻塞隊(duì)列:(說(shuō)一下箭頭后的裝逼知識(shí))
- ArrayBlockingQueue ->有邊界;底層數(shù)組;不支持同時(shí)讀寫(xiě),底層用一把鎖(ReentrantLock)
- LinkedBlockingQueue ->可選擇的有邊界;支持同時(shí)讀寫(xiě),底層兩把鎖
- PriorityBlockingQueue -> 底層數(shù)據(jù)結(jié)構(gòu)是堆 -> 數(shù)組與堆的轉(zhuǎn)換:heapInsert(插入堆)、heapify(堆化)
- DelayQueue -> 單機(jī)版延遲隊(duì)列;添加元素實(shí)現(xiàn)Delay接口,重寫(xiě)兩個(gè)方法。
- SynchronousQueue -> 容量為0,put()添加一個(gè)元素后,會(huì)等待task()刪除一個(gè)元素
- LinkedBlockingDeque。
- 非阻塞隊(duì)列:PriorityQueue、ConcurrentLinkedQueue、LinkedTransferQueue。
隊(duì)列方法:(@&@)
35. 集合類(lèi)是怎么解決高并發(fā)中的問(wèn)題?
- 先說(shuō)一下,非安全的集合類(lèi)。
- 然后再說(shuō),普通的安全的集合類(lèi)(Vector HashTable)。
- 最后說(shuō),JUC下的高并發(fā)集合類(lèi)。
- ConcurrentHashMap和底層 -> ConcurrentHashMap和HashTable的區(qū)別(拓展點(diǎn))。
- ConcurrentSkipListMap(Set):線程安全的有序的哈希表,它替代TreeMap。
- CopyOnWriteArrayList:寫(xiě)入時(shí),加鎖將原數(shù)據(jù)復(fù)制到另一個(gè)數(shù)組中,它只能保證數(shù)據(jù)的最終一致性,不適合頻繁寫(xiě)入的操作。
36. JDK1.8的新特性?
- Lambda表達(dá)式。
- 函數(shù)式編程:Optional、Predicate、Supplier、Consumer、Function。
- 方法引用和構(gòu)造器調(diào)用 --> :: 關(guān)鍵字來(lái)傳遞方法或者構(gòu)造函數(shù)引用。
- 接口中可以有默認(rèn)方法:default關(guān)鍵字。
- Stream API。
- 新時(shí)間日期API。
- CompletableFuture類(lèi)。
37. Stream的并行操作原理?Stream并行的線程池是從哪里來(lái)的?
Stream的概念:
Stream專(zhuān)注于對(duì)容器對(duì)象進(jìn)行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作。
三個(gè)操作步驟:
- 創(chuàng)建Stream:從一個(gè)數(shù)據(jù)源,如集合、數(shù)組中獲取流。
- 中間操作:一個(gè)操作的中間鏈,對(duì)數(shù)據(jù)源的數(shù)據(jù)進(jìn)行操作。
- 終止操作:一個(gè)終止操作,執(zhí)行中間操作鏈,并產(chǎn)生結(jié)果。
Stream并行(parallel)原理:
它底層依賴(lài)于ForkJoinPool.commonPool線程池,這是一個(gè)JVM進(jìn)程全局共享的線程。在ForkJoin上進(jìn)行了一層封裝,將Stream不斷嘗試分解成更小的集合,然后使用ForkJoin框架分而治之。
38. 關(guān)于intern() pass
String a=new String("123")+new String("456"); // String b=new String("123456"); String intern = a.intern(); System.out.println(intern==a); // 注釋輸出true,取消注釋 輸出false
參考文章(不錯(cuò)):
https://blog.csdn.net/qq_41884976/article/details/83353389
39. Java種的代理有幾種實(shí)現(xiàn)方式?
靜態(tài)代理:
在程序編譯前,代理類(lèi)已經(jīng)被創(chuàng)建完成。
動(dòng)態(tài)代理:
- JDK:Proxy
- 面向接口的動(dòng)態(tài)代理:代理一個(gè)對(duì)象去增強(qiáng)面向某個(gè)接口中定義的方法。
- 沒(méi)有接口不可用。
- 只能讀取到接口上的一些注解。
- 舉例:MyBatis DeptMapper dm=sqlSession.getMapper(DeptMapper.class)
- 第三方:CGlib
- 面向父類(lèi)的動(dòng)態(tài)代理(繼承)-> 底層原理:操作字節(jié)碼生成新的類(lèi) -> 大量使用可能導(dǎo)致元空間的溢出(拓展點(diǎn))
- 有沒(méi)有接口都可以使用。
- 可以讀取類(lèi)上的注解。
- 舉例: AOP 日志 性能檢測(cè) 事務(wù)
40. Java中的自增是線程安全的嗎,如何實(shí)現(xiàn)線程安全的自增?
- i++、++i 不是線程安全的。
- 解決1:增加Synchronized進(jìn)行線程同步。
- 解決2:使用Reetrantent鎖進(jìn)行鎖定(lock、unlock處理)。
- 解決3:AtomicInteger -> 使用Unsafe中的CAS -> CAS的ABA問(wèn)題。