Java面试题2-附答案
JVM的內存結構
根據 JVM 規范,JVM 內存共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。
?
1、Java虛擬機棧:
線程私有;每個方法在執行的時候會創建一個棧幀,存儲了局部變量表,操作數棧,動態連接,方法返回地址等;每個方法從調用到執行完畢,對應一個棧幀在虛擬機棧中的入棧和出棧。
?
2、堆:
線程共享;被所有線程共享的一塊內存區域,在虛擬機啟動時創建,用于存放對象實例。
?
3、方法區:
線程共享;被所有線程共享的一塊內存區域;用于存儲已被虛擬機加載的類信息,常量,靜態變量等。
?
4、程序計數器:
線程私有;是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱為“線程私有”的內存。
?
5、本地方法棧:
線程私有;主要為虛擬機使用到的Native方法服務。
?
?
?
強引用,軟引用和弱引用的區別
強引用:
只有這個引用被釋放之后,對象才會被釋放掉,只要引用存在,垃圾回收器永遠不會回收,這是最常見的New出來的對象。
?
軟引用:
內存溢出之前通過代碼回收的引用。軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。
?
弱引用:
第二次垃圾回收時回收的引用,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。弱引用主要用于監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。
?
?
?
數組在內存中如何分配
1、簡單的值類型的數組,每個數組成員是一個引用(指針),引用到棧上的空間(因為值類型變量的內存分配在棧上)
2、引用類型,類類型的數組,每個數組成員仍是一個引用(指針),引用到堆上的空間(因為類的實例的內存分配在堆上)
?
?
用過哪些設計模式,手寫一個(除單例)
設計模式早有總結,看這里:23種設計模式完整總結
?
?
springmvc的核心是什么,請求的流程是怎么處理的,控制反轉怎么實現的
核心:
控制反轉和面向切面
?
請求處理流程:
1、首先用戶發送請求到前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;
2、頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,并進行驗證,然后將命令對象委托給業務對象進行處理;處理完畢后返回一個ModelAndView(模型數據和邏輯視圖名);
3、前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,并把模型數據傳入以便視圖渲染;
4、前端控制器再次收回控制權,將響應返回給用戶。
?
控制反轉如何實現:
我們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。
spring中默認的bean為單實例模式,通過bean的class引用反射機制可以創建這個實例。
因此,spring框架通過反射替我們創建好了實例并且替我們維護他們。
A需要引用B類,spring框架就會通過xml把B實例的引用傳給了A的成員變量。
?
?
?
mybatis如何處理結果集
MyBatis的結果集是通過反射來實現的。并不是通過get/set方法。在實體類中無論是否定義get/set()方法,都是可以接收到的。
?
如果面試只是考你這個點的話就恭喜了。如果繼續深問流程,那就需要自己找一些源碼來閱讀了。
?
?
java的多態表現在哪里
主要有兩種表現形式:重載和重寫
?
重載:
是發生在同一類中,具有相同的方法名,主要是看參數的個數,類型,順序不同實現方法的重載的,返回值的類型可以不同。
?
重寫:
是發生在兩個類中(父類和子類),具有相同的方法名,主要看方法中參數,個數,類型必須相同,返回值的類型必須相同。
?
參考文檔:https://mp.weixin.qq.com/s/VyVkJwyVOIGOEhww_m0XNg
轉載于:https://www.cnblogs.com/itbuyixiaogong/p/9066979.html
總結
以上是生活随笔為你收集整理的Java面试题2-附答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高手不得不知的Java集合List的细节
- 下一篇: 2018 年,去百度面试 Java 后端