JAVA後臺面試題答案
答案:
1. Arrays.sort實現原理和Collection實現原理
答:Arrays.sort():快排
Collections.sort() :MergeSort,後來變成了TimSort
2. foreach和while的區別(編譯之後)
答:foreach針對確定次數;while不確定次數
3. 執行緒池的種類,區別和使用場景
答:newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。
4. 分析執行緒池的實現原理和執行緒的排程過程
答:多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。
假設一個伺服器完成一項任務所需時間為:T1 建立執行緒時間,T2 線上程中執行任務的時間,T3 銷燬執行緒時間。
如果:T1 + T3 遠大於 T2,則可以採用執行緒池,以提高伺服器效能。
一個執行緒池包括以下四個基本組成部分:
A、執行緒池管理器(ThreadPool):用於建立並管理執行緒池,包括 建立執行緒池,銷燬執行緒池,新增新任務;
B、工作執行緒(PoolWorker):執行緒池中執行緒,在沒有任務時處於等待狀態,可以迴圈的執行任務;
C、任務介面(Task):每個任務必須實現的介面,以供工作執行緒排程任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;
D、任務佇列(taskQueue):用於存放沒有處理的任務。提供一種緩衝機制。
執行緒池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高伺服器程式效能的。它把T1,T3分別安排在伺服器程式的啟動和結束的時間段或者一些空閒的時間段,這樣在伺服器程式處理客戶請求時,不會有T1,T3的開銷了。
執行緒池不僅調整T1,T3產生的時間段,而且它還顯著減少了建立執行緒的數目,重用執行緒池中的執行緒。
按照優先順序排程執行緒。
5. 執行緒池如何調優
答:使用執行緒池的核心問題在於應該使用多少執行緒。利特爾法則、拆分執行緒池
6. 執行緒池的最大執行緒數目根據什麼確定
答:corePoolSize: tasks*tasktime個執行緒數
queueCapacity: corePoolSize/tasktime)*responsetime
maxPoolSize: (每秒任務-queueCapacity)*(每秒單個執行緒處理任務數量)
7. 動態代理的幾種方式
答:代理模式的作用是:為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。
動態代理:在程式執行時,運用反射機制動態建立而成。每一個動態代理類都必須要實現InvocationHandler這個介面。
jdk動態代理:jdk動態代理是由Java內部的反射機制來實現的,應用前提,必須是目標類基於統一的介面
cglib動態代理:動態代理框架,藉助asm來實現的
8. HashMap的併發問題
答:HashMap是非執行緒安全的,可能造成死迴圈。
9. 瞭解LinkedHashMap的應用嗎
答:LinkedHashMap是HashMap的一個子類,它保留插入的順序,輸入順序和輸出順序相同。底層使用hash表和雙向連結串列來儲存。Eg。LRU快取
10. 反射的原理,反射建立類例項的三種方式是什麼?
A. 物件呼叫getClass()方法來建立一個Class型別的對像
B. 通過類名,class的方式例項化Class類物件
C. Class.forName(“類全名”)的方式例項化一個Class類
11. cloneable介面實現原理,淺拷貝or深拷貝
cloneable介面:實現淺拷貝
淺拷貝(位拷貝):同一片記憶體空間。記憶體洩露、相互影響
深拷貝(值拷貝):重新分配記憶體空間,值一致
12. Java NIO (New IO)使用
非阻塞
在NIO中有幾個核心物件需要掌握:緩衝區(Buffer)、通道(Channel)、選擇器(Selector)。
緩衝區:在NIO庫中,所有資料都是用緩衝區處理的
通道:通道是一個物件,通過它可以讀取和寫入資料,將資料從通道讀入緩衝區,再從緩衝區獲取這個位元組
選擇器:能檢測一個或多個通道 (channel) 上的事件,並將事件分發出去。
13. hashtable和hashmap的區別及實現原理,hashmap會問到陣列索引,hash碰撞怎麼解決
Put過程:
A. 先獲取key物件的hashcode值進行處理
B. 將處理後的hashcode對table的length-1進行取餘獲得index即在陣列中的索引位置
C. 然後對該位置的Entry進行判斷,若該位置為空,那麼插入新的Entry。
D. 若當前Entry不為空,那麼根據key.equals()對該連結串列進行遍歷,若是該key物件存在,則用新值代替舊值,否則在連結串列尾端插入新的Entry。
處理衝突的方式:開放地址法、拉鍊法、建立公共溢位區
14. arraylist和linkedlist區別及實現原理
區別 Arraylist Linkedlist
資料結構 動態陣列 連結串列
隨機訪問 快 慢
Add、remove 慢 快
實現原理
ArrayList原理:
當元素超出陣列內容,會產生一個新陣列,將原來陣列的資料複製到新陣列中,再將新的元素新增到新陣列中。
ArrayList:是按照原陣列的50%來延長,構造一個初始容量為10的空列表
LinkedList原理:
不可以在初始化時候指定大小,每次向其中加入元素時候,容量自動加1。
15. 反射中,Class.forName和ClassLoader區別
![這裡寫圖片描述](https://img-blog.csdn.net/20170320094318654?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemQ4MzY2MTQ0Mzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
- 1
- 2
16. String,Stringbuffer,StringBuilder的區別?
基本原則:
a.如果要操作少量的資料,用String ;單執行緒操作大量資料,用StringBuilder ;多執行緒操作大量資料,用StringBuffer。
b.不要使用String類的”+”來進行頻繁的拼接
c.在構造 StringBuffer 或 StringBuilder 時應儘可能指定它們的容量。
17. 有沒有可能2個不相等的物件有相同的hashcode
可能。結合直接定址和鏈式定址的雜湊表,掛在一個連結串列上的hashcode值相等
18. 簡述NIO的最佳實踐,比如netty,mina
19. TreeMap的實現原理
TreeMap的實現是紅黑樹演算法的實現,紅黑樹更是一顆自平衡的排序二叉樹。
TreeMap繼承AbstractMap,實現NavigableMap、Cloneable、Serializable三個介面。
在TreeMap的put()的實現方法中主要分為兩個步驟,第一:構建排序二叉樹,第二:平衡二叉樹。
紅黑二叉樹而言它主要包括三大基本操作:左旋、右旋、著色。