最近面試總是被問到一些奇怪的問題,說奇怪吧也不妥,偏僻更合適一點。猛的被問到這些,一下子答不上來,或者回答的不夠全面,錯失良機使我對此深惡痛絕,痛定思痛之后,我決定系統(tǒng)的對Java知識體系做一個完整學習與總結(jié),避免此類事情發(fā)生。那么就從現(xiàn)在開始吧。
第一個問題是: 談談你對Java平臺的理解?“Java是解釋執(zhí)行”,這句話正確嗎?
回答:
Java是一種面向?qū)ο笳Z言,最顯著特性有兩個方面,第一就是我們常說的“一次編譯,到處執(zhí)行。”,也是Java跨平臺能力的基礎(chǔ),之所以這么說,是因為java語言本身和其他語言沒有太大的區(qū)別,java語言并不能夠跨平臺,而是在不同的平臺都有能夠讓Java執(zhí)行的平臺而已(安裝了jdk);第二個就是gc(垃圾回收),大部分情況下,Java的內(nèi)存并不需要我們手動的分配和回收,gc會幫我們完成這部分工作。
JRE(Java Runtime Environment)和JDK(Java Development Kit)。JRE是Java運行時環(huán)境,包含了JVM和Java類庫等,JDK是Java開發(fā)環(huán)境,可以看做是JRE的超集,提供了更多的工具,比如編譯器,診斷工具等。
“Java是解釋執(zhí)行”這句話并不準確。Java代碼首先通過javac編譯成字節(jié)碼(.class文件),字節(jié)碼是不能夠在機器運行的,在運行Java代碼時,jvm會內(nèi)嵌的解釋器(classloader)會將字節(jié)碼轉(zhuǎn)換為機器能夠識別的機器碼,然后運行。這樣看起來java代碼好像就是在解釋字節(jié)碼來運行。但是還有另外一種情況,JIT(just in time),這又是什么意思呢?jit就是我們通常說的動態(tài)編譯器,它能夠在運行時,將熱點代碼編譯成機器碼,這種情況下部分熱點代碼(經(jīng)常運行的代碼)就屬于編譯執(zhí)行,而不是解釋執(zhí)行。