1. 程式人生 > >Java面試題超詳細總結

Java面試題超詳細總結

1:ThreadLocal(執行緒變數副本) Synchronized實現記憶體共享,ThreadLocal為每個執行緒維護一個本地變數。 採用空間換時間,它用於執行緒間的資料隔離,為每一個使用該變數的執行緒提供一個副本,每個執行緒都可以獨立地改變自己的副本,而不會和其他執行緒的副本衝突。 ThreadLocal類中維護一個Map,用於儲存每一個執行緒的變數副本,Map中元素的鍵為執行緒物件,而值為對應執行緒的變數副本。 ThreadLocal在Spring中發揮著巨大的作用,在管理Request作用域中的Bean、事務管理、任務排程、AOP等模組都出現了它的身影。 Spring中絕大部分Bean都可以宣告成Singleton作用域,採用ThreadLocal進行封裝,因此有狀態的Bean就能夠以singleton的方式在多執行緒中正常工作了。 友情連結:深入研究java.lang.ThreadLocal類

2:JAVA多型的實現原理(Override和Overload的含義以及區別)

a.抽象的來講,多型的意思就是同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)

b.實現的原理是動態繫結,程式呼叫的方法在執行期才動態繫結,追溯原始碼可以發現,JVM 通過引數的自動轉型來找到合適的辦法。

3:JAVA 中堆和棧的區別,說下java 的記憶體機制

a.基本資料型別比變數和物件的引用都是在棧分配的

b.堆記憶體用來存放由new建立的物件和陣列

c.類變數(static修飾的變數),程式在一載入的時候就在堆中為類變數分配記憶體,堆中的記憶體地址存放在棧中

d.例項變數:當你使用java關鍵字new的時候,系統在堆中開闢並不一定是連續的空間分配給變數,是根據零散的堆記憶體地址,通過雜湊演算法換算為一長串數字以表徵這個變數在堆中的”物理位置”,例項變數的生命週期–當例項變數的引用丟失後,將被GC(垃圾回收器)列入可回收“名單”中,但並不是馬上就釋放堆中記憶體

e.區域性變數: 由宣告在某方法,或某程式碼段裡(比如for迴圈),執行到它的時候在棧中開闢記憶體,當局部變數一但脫離作用域,記憶體立即釋放

4:wait()和sleep()的區別

sleep來自Thread類,和wait來自Object類

呼叫sleep()方法的過程中,執行緒不會釋放物件鎖。而 呼叫 wait 方法執行緒會釋放物件鎖

sleep睡眠後不出讓系統資源,wait讓出系統資源其他執行緒可以佔用CPU

sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒

5:抽象類和介面的區別

a.一個類只能繼承單個類,但是可以實現多個介面

b.抽象類中可以有構造方法,介面中不能有構造方法

c.抽象類中的所有方法並不一定要是抽象的,你可以選擇在抽象類中實現一些基本的方法。而介面要求所有的方法都必須是抽象的

d.抽象類中可以包含靜態方法,介面中不可以

e.抽象類中可以有普通成員變數,介面中不可以