阿里P7講解java面試填坑解惑篇

哥們兒告訴我應聘者和往常一樣甚至變少,因此大家不用太擔心,只要認真準備技術知識和我之前講到的技術面試話語基本都能找到一份如意的工作。

話不多說,言歸正傳我們來解答上期大家的疑問吧。

NO1.請簡單描述JDK和JRE的區別?

回答JDK和JRE的區別這道題,首先要回答兩個名次的概念,JDK就是Java Developement Kit的縮寫,java最核心的東西,包括了java的運行環境(JRE),一些基本類庫方便開發人員開發程序和源碼壓縮等。主要由bin(可執行命令如javac,java等)、include(和java虛擬機交互的頭文件)、lib(java類庫)、 jre(運行環境)組成。

而JRE(Java Runtime Environment)是java的運行環境,包含java虛擬機和一些基本運行類庫,但不包括調試和開發工具,一個項目被編譯為.class後綴後即可在JRE上運行。

順便補一下上面提到的JVM(Java Virtual Machine)知識,JVM是 java運行時所需要的環境,JVM是一種用於計算設備的規範,它是一個虛構出來的微小計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。針對java用戶,也就是擁有可運行的.class文件包(jar或者war)的用戶。

裡面主要包含了jvm和java運行時基本類庫(rt.jar)。rt.jar可以理解為java源碼編譯後的jar包。Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行,比如windows或者linux。這就是Java所宣稱的“一次編譯,到處運行”的原因。

阿里P7講解java面試填坑解惑篇

NO2.告訴我JVM的類加載過程?對不起各位這裡直接提升了面試的難度,但是工作三年以上的中級程序員還是需要了解的,看圖說話還差哪些過程麼。

第二題考察大家對JVM加載class的理解程度,題目的圖中缺少的步驟為應用和卸載兩步,因為當JVM完成前面三步以後就等系統調用,當實例完成線程任務後即被JVM進行GC,當Class不被引用後就會被卸載。

阿里P7講解java面試填坑解惑篇

NO3.工作快三年了,瞭解多JVM的雙親委派模式麼,為什麼需要由父類加載類再傳遞給最下面的類加載器?

java中可以加載類的加載器由高到低順序為BootstrapClassLoader,ExtensionClassLoader,AppClassLoader三類,JVM加載類時都是由AppClassLoader請求他的父類ExtensionClassLoader進行加載,如果父類可以加載類到虛擬機則子類不能再加載類,依次類推,只有那些一二級類加載器都沒發現的類才被AppClassLoader加載,這類class可以理解為自定義類。這樣設置的初衷主要是出於安全考慮,免得被不懷好意的人破篡改API類庫。

阿里P7講解java面試填坑解惑篇

NO4.對了如何如何控制多個子線程任務執行完成,再執行主線程程序?除了thread.join(2000),還有其他方法麼?

在主線程中啟動子線程,為了保證子線程統一執行完成再執行主線程代碼除了上面提到的join(),join(2000)外,其實還可以使用countDownLatch方法,主要實現原理是通過在主程序中設置子線程數量,同時在子線程中調用countDownLatch.countDown()方法計數達到統計線程的目的,順便提到一下CyclicBarrier目的是讓子線程同時完成的,感興趣的同學可以多去了解下。

NO5. 下面的代碼執行以後S1,S2分別等於多少?還是說會出現什麼問題?

阿里P7講解java面試填坑解惑篇

此題主要考察越界和轉化的問題,S1的值是-128,S2的值是2。第一行代碼因為byte最大值是127在計算機中表示為01111111加1後變為10000000此時是補碼,計算機只存儲補碼,此時計算機都是通過補碼來表示數值的11111111的補碼是符號位不變其他位取反為10000000(源碼)就是-128,S2的時候其實是Integer類型強制轉換的結果。

NO6.年輕人,請回答一下servlet的生命週期,這個對於瞭解配置加載和預加載參數有重要意義?

主要考察對容器生命週期的理解,無論後面出現怎樣的框架,底層始終都沒有變化,答案基本回答到點上了,說一句目前的大多框架都是默認單例類實例的,因此使用完成後不會被destroy掉。

阿里P7講解java面試填坑解惑篇

NO7.想必你知道一些關於threadLocal的知識,我不問你怎麼使用,也不問你使用場景。我想說的是線程池提供給用戶的線程會存在數據混淆麼?(這個可能有點高端,有些高級開發都不知道,呵呵)

關於threadLocal知識,目前來說使用的不是很多,大家可以瞭解他的使用場景是為了隔離數據,就是說希望線程各自訪問各自的數據互不干涉。題目中的坑其實就是線程池公用出現的問題,當上一個線程不是新創建的而是來自線程池時存在threadLocal中止沒被清空的情況,造成數據篡寫。正確的做法就是每次使用完成後都立馬置為null,這樣伴隨著線程銷燬,變量也被銷燬。

NO8.知道序列化吧,什麼情況下需要序列化?RPC服務中的參數為啥都需要序列化呢?參數中的日期類型到底用sql.Date還是util.Date?

這道題其實是考察序列化的場景的,序列化的目的依賴為了進行網絡傳輸,確保傳過去的字節流還能被反編譯找到對應的類,二來為了方便本地硬盤存儲。RPC(Remote Protocal Call)服務為異步服務都是通過網絡傳輸數據,當然需要序列化數據。Java.sql.Date類繼承java.util.Date類,但是並未實現序列化因此作為參數不能在RPC服務中傳輸。

阿里P7講解java面試填坑解惑篇


分享到:


相關文章: