最近面試總是被問到一些奇怪的問題,說奇怪吧也不妥豹爹,偏僻更合適一點(diǎn)裆悄。猛的被問到這些,一下子答不上來臂聋,或者回答的不夠全面光稼,錯(cuò)失良機(jī)使我對(duì)此深惡痛絕,痛定思痛之后孩等,我決定系統(tǒng)的對(duì)Java知識(shí)體系做一個(gè)完整學(xué)習(xí)與總結(jié)艾君,避免此類事情發(fā)生。那么就從現(xiàn)在開始吧肄方。
第一個(gè)問題是: 談?wù)勀銓?duì)Java平臺(tái)的理解冰垄?“Java是解釋執(zhí)行”,這句話正確嗎权她?
回答:
Java是一種面向?qū)ο笳Z(yǔ)言虹茶,最顯著特性有兩個(gè)方面逝薪,第一就是我們常說的“一次編譯,到處執(zhí)行蝴罪《茫”,也是Java跨平臺(tái)能力的基礎(chǔ)洲炊,之所以這么說感局,是因?yàn)閖ava語(yǔ)言本身和其他語(yǔ)言沒有太大的區(qū)別,java語(yǔ)言并不能夠跨平臺(tái)暂衡,而是在不同的平臺(tái)都有能夠讓Java執(zhí)行的平臺(tái)而已(安裝了jdk)询微;第二個(gè)就是gc(垃圾回收),大部分情況下狂巢,Java的內(nèi)存并不需要我們手動(dòng)的分配和回收撑毛,gc會(huì)幫我們完成這部分工作。
JRE(Java Runtime Environment)和JDK(Java Development Kit)唧领。JRE是Java運(yùn)行時(shí)環(huán)境藻雌,包含了JVM和Java類庫(kù)等,JDK是Java開發(fā)環(huán)境,可以看做是JRE的超集瓣履,提供了更多的工具哈肖,比如編譯器,診斷工具等做个。
“Java是解釋執(zhí)行”這句話并不準(zhǔn)確。Java代碼首先通過javac編譯成字節(jié)碼(.class文件)滚局,字節(jié)碼是不能夠在機(jī)器運(yùn)行的居暖,在運(yùn)行Java代碼時(shí),jvm會(huì)內(nèi)嵌的解釋器(classloader)會(huì)將字節(jié)碼轉(zhuǎn)換為機(jī)器能夠識(shí)別的機(jī)器碼藤肢,然后運(yùn)行太闺。這樣看起來java代碼好像就是在解釋字節(jié)碼來運(yùn)行。但是還有另外一種情況嘁圈,JIT(just in time)省骂,這又是什么意思呢?jit就是我們通常說的動(dòng)態(tài)編譯器最住,它能夠在運(yùn)行時(shí)冀宴,將熱點(diǎn)代碼編譯成機(jī)器碼,這種情況下部分熱點(diǎn)代碼(經(jīng)常運(yùn)行的代碼)就屬于編譯執(zhí)行温学,而不是解釋執(zhí)行略贮。