1. 程式人生 > >阿里P7講解java面試填坑解惑篇

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

快年底了,最近的勁爆新聞也是不停的往出冒,先是咱們的出行大哥ofo被可愛的使用者集中退款,再是手機領域的大佬金立手機已經被法院裁定破產重組,嚇得我也是最近趕緊聯絡我的朋友打聽最近求職者是否變多。哥們兒告訴我應聘者和往常一樣甚至變少,因此大家不用太擔心,只要認真準備技術知識和我之前講到的技術面試話語基本都能找到一份如意的工作。

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

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

NO1.回答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所宣稱的“一次編譯,到處執行”的原因。
在這裡插入圖片描述

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

NO2.第二題考察大家對JVM載入class的理解程度,題目的圖中缺少的步驟為應用和解除安裝兩步,因為當JVM完成前面三步以後就等系統呼叫,當例項完成執行緒任務後即被JVM進行GC,當Class不被引用後就會被解除安裝。
在這裡插入圖片描述

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

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

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

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

NO5. 下面的程式碼執行以後S1,S2分別等於多少?還是說會出現什麼問題?
在這裡插入圖片描述
NO5.此題主要考察越界和轉化的問題,S1的值是-128,S2的值是2。第一行程式碼因為byte最大值是127在計算機中表示為01111111加1後變為10000000此時是補碼,計算機只儲存補碼,此時計算機都是通過補碼來表示數值的11111111的補碼是符號位不變其他位取反為10000000(原始碼)就是-128,S2的時候其實是Integer型別強制轉換的結果。

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

N06.主要考察對容器生命週期的理解,無論後面出現怎樣的框架,底層始終都沒有變化,答案基本回答到點上了,說一句目前的大多框架都是預設單例類例項的,因此使用完成後不會被destroy掉。
在這裡插入圖片描述

NO7.想必你知道一些關於threadLocal的知識,我不問你怎麼使用,也不問你使用場景。我想說的是執行緒池提供給使用者的執行緒會存在資料混淆麼?(這個可能有點高階,有些高階開發都不知道,呵呵)

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

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

NO8.這道題其實是考察序列化的場景的,序列化的目的依賴為了進行網路傳輸,確保傳過去的位元組流還能被反編譯找到對應的類,二來為了方便本地硬碟儲存。RPC(Remote Protocal Call)服務為非同步服務都是通過網路傳輸資料,當然需要序列化資料。Java.sql.Date類繼承java.util.Date類,但是並未實現序列化因此作為引數不能在RPC服務中傳輸。
在這裡插入圖片描述

NO9.請問各位大俠,這個詭異的程式碼能執行麼?

NO9.這道題已經有小夥伴給出了答案,其實這道題大家都會想著null轉換物件肯定還是null,然後就空指標了,結果是被狠狠打臉了。其實我之前也不知道這個東西,還好查了資料及時補起來了,一句話:null不屬於任何型別,可以被轉換成任何型別,但是用instanceof永遠返回false.

歡迎大家加入粉絲群:963944895,群內免費分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫教學視訊及架構學習思維導圖