java面試題(楊曉峰)---第一講談?wù)勀銓?duì)java平臺(tái)的理解

本人總結(jié):

面向?qū)ο?封裝,繼承,多態(tài))

平臺(tái)無(wú)關(guān)性(jvm運(yùn)行,class文件)

語(yǔ)言(泛型,lambda)

類庫(kù)(集合,并發(fā),網(wǎng)絡(luò),io/nio)

jre(java運(yùn)行環(huán)境,JVM,類庫(kù))

JDK(java開發(fā)工具,包括JRE,javac,診斷工具)

"一次編譯,到處執(zhí)行"java平臺(tái)依靠JVM和.class字節(jié)碼文件屏蔽不同平臺(tái)軟件硬件差異.認(rèn)為C/C++是面向操作系統(tǒng)的編程,java是面向虛擬機(jī)的編程.

通過(guò)增加一個(gè)間接地中間層來(lái)"解耦"是計(jì)算機(jī)領(lǐng)域常用的一門"藝術(shù)手法".如:虛擬機(jī),操作系統(tǒng),http等.




從你接觸java開發(fā)到現(xiàn)在,你對(duì)java最直觀的印象是什么呢?是他宣傳的"write once ,run anywhere"還是目前看已經(jīng)有些形式主義的語(yǔ)法呢?你對(duì)于java平臺(tái)到底了解到什么程度?請(qǐng)先停下來(lái)總結(jié)思考一下.

今天我要問(wèn)你的問(wèn)題是,談?wù)勀銓?duì)java平臺(tái)的理解?"java是解釋執(zhí)行"這句話正確嗎?

典型回答.

java本身是一種面向?qū)ο蟮恼Z(yǔ)言,最顯著地特征有兩個(gè)方面,一是所謂的"書寫一次,到處運(yùn)行.write once,run anywhere"能夠非常容易的獲得跨平臺(tái)能力,另外就是垃圾回收,java通過(guò)垃圾回收器,回收分配內(nèi)存,大部分情況下,程序員不需要自己操心內(nèi)存的分配和回收.我們?nèi)粘?huì)接觸到JRE或者JDK,jre就是java的運(yùn)行環(huán)境,包括:jvm和java類庫(kù),以及一些模塊等.jdk可以看做jre的一個(gè)超集,提供更多工具,如:編譯器,各種診斷工具.

對(duì)于"java是解釋執(zhí)行"這句話并不準(zhǔn)確,我們開發(fā)的java源代碼,首先通過(guò)javac編譯成字節(jié)碼,然后運(yùn)行時(shí),通過(guò)java虛擬機(jī)(JVM)內(nèi)嵌的解釋器將字節(jié)碼轉(zhuǎn)換成為最終的機(jī)器碼,但是常見的jvm,比如我們大多數(shù)情況下使用的oracleJDK提供的hotspot jvm,都提供了jit編譯器,就是通常所說(shuō)的動(dòng)態(tài)編譯器,jit能夠在運(yùn)行時(shí)將熱點(diǎn)代碼編譯成機(jī)器碼,這種情況下部分熱點(diǎn)代碼就屬于編譯執(zhí)行,而不是解釋執(zhí)行.

考點(diǎn)分析;

其實(shí)這個(gè)問(wèn)題,問(wèn)的有點(diǎn)籠統(tǒng).題目本身是非常開放的,往往考察的是多個(gè)方面,比如,基礎(chǔ)知識(shí)理解是否清晰,是否掌握java平臺(tái)主要模塊和運(yùn)行原理,很多面試者會(huì)在這種問(wèn)題上吃虧,稍微緊張一下,就不知從何說(shuō)起.

對(duì)于這類籠統(tǒng)的問(wèn)題,你需要盡量表現(xiàn)出自己的思維深度和系統(tǒng)化理解,java知識(shí)理解也要全面.避免讓面試官覺(jué)得是"知其然而不知其所",畢竟明白基本組成和機(jī)制,是日常工作中進(jìn)行問(wèn)題診斷或者性能調(diào)優(yōu)等多方面事情的基礎(chǔ),相信沒(méi)人會(huì)不喜歡"熱愛學(xué)習(xí)和思考"的面試者.

即使覺(jué)得自己的回答不是非常完善,也不用擔(dān)心,我個(gè)人覺(jué)得這種籠統(tǒng)的問(wèn)題,回答的片面寫也是正常,大多數(shù)有經(jīng)驗(yàn)的面試官,不會(huì)因?yàn)橐粋€(gè)問(wèn)題輕易對(duì)面試者下結(jié)論.會(huì)盡量引導(dǎo)面試者展示他的真實(shí)水平.這種問(wèn)題是開場(chǎng)熱身,然后根據(jù)你的回答拓展問(wèn)題.

知識(shí)拓展

回歸正題,對(duì)于java平臺(tái)的理解,可以從很多方面簡(jiǎn)明扼要的談,例如;java語(yǔ)言特性包括泛型,lambda等語(yǔ)言特性.基礎(chǔ)類庫(kù),包括集合,io\nio,網(wǎng)絡(luò),并發(fā),安全等基礎(chǔ)類庫(kù).對(duì)于我們?nèi)粘9ぷ鲬?yīng)用較多的類庫(kù),面試前可以系統(tǒng)總結(jié),有助臨場(chǎng)發(fā)揮.

或者談?wù)刯vm的一些基礎(chǔ)概念和機(jī)制,比如java的類加載機(jī)制,常用版本jdk的內(nèi)嵌的class-loader,例如bootstrap,application,和extension? class-loader,類加載大致過(guò)程;加載,驗(yàn)證,連接,初始化(周志明<深入理解java虛擬機(jī)>很好的jvm上手書籍)自定義class-loader等.還有垃圾收集的基本原理,最常見的垃圾收集器,如cms,g1等對(duì)于適用于什么樣的工作負(fù)載也要心理有數(shù),這些都是可以拓展的領(lǐng)域,在后面專欄進(jìn)行更系統(tǒng)介紹.

jdk或java領(lǐng)域的工具,如編譯器,運(yùn)行時(shí)環(huán)境,安全工具,診斷和監(jiān)控工具.這些基本工具是日常日常工作效率的保證.而對(duì)于其他的語(yǔ)言平臺(tái),也是觸類旁通.


這是總結(jié)的一個(gè)寬泛藍(lán)圖


回到前面討論的解釋執(zhí)行和編譯執(zhí)行,有些面試官喜歡刨根問(wèn)底.因?yàn)檫@是了解面試者知識(shí)深度的有效方法,我們進(jìn)行深入探討.

我們將java分成:編譯時(shí)期和運(yùn)行時(shí)期.java的編譯不同于c/c++生成可以直接執(zhí)行的機(jī)器碼的編譯.

java源碼編譯生成".class"文件,此文件實(shí)際為字節(jié)碼,并非可以直接執(zhí)行的機(jī)器碼.

java通過(guò)字節(jié)碼和java虛擬機(jī)(JVM)這些跨平臺(tái)的抽象,屏蔽了操作系統(tǒng)和硬件的細(xì)節(jié).這是實(shí)現(xiàn)"一次編譯,到處執(zhí)行"的基礎(chǔ).

在運(yùn)行時(shí),jvm會(huì)通過(guò)類加載器加載字節(jié)碼,解釋或者編譯執(zhí)行..java虛擬機(jī)啟動(dòng)時(shí)可以指定不同的參數(shù)對(duì)運(yùn)行模式進(jìn)行選擇.

java虛擬機(jī)啟動(dòng)時(shí),可以指定不同的參數(shù)對(duì)運(yùn)行模式進(jìn)行選擇.

jvm作為一個(gè)強(qiáng)大的平臺(tái).不僅可以運(yùn)行java語(yǔ)言,本質(zhì)上字節(jié)碼都可以運(yùn)行.有大量jvm語(yǔ)言活躍在不同場(chǎng)景.

簡(jiǎn)單介紹java平臺(tái),提綱挈領(lǐng)構(gòu)建整體印象,包括java語(yǔ)言,核心類庫(kù),java虛擬機(jī).等

woj:

"一次編譯,到處執(zhí)行"說(shuō)的是java語(yǔ)言跨平臺(tái)的特性,java的跨平臺(tái)特性與java虛擬機(jī)的存在密不可分.java通過(guò)字節(jié)碼和java虛擬機(jī)(JVM)這些跨平臺(tái)的抽象,屏蔽了操作系統(tǒng)和硬件的細(xì)節(jié).這是實(shí)現(xiàn)"一次編譯,到處執(zhí)行"的基礎(chǔ).不同平臺(tái)的java運(yùn)行環(huán)境不同但是運(yùn)行的字節(jié)碼文件(.class)是相同的.因此才有了java一次編譯到處執(zhí)行的效果,跨平臺(tái)語(yǔ)言不止java一種但是java是比較成熟的一種.java虛擬機(jī)和dos類似,相當(dāng)于一個(gè)供程序運(yùn)行的平臺(tái).

?magict4;

我對(duì)"compile once ,run anywhere"這個(gè)宣傳語(yǔ)提出的背景很感興趣.似乎在暗示c語(yǔ)言的一個(gè)缺陷,對(duì)于每一個(gè)不同的平臺(tái),源代碼都要被再次編譯,但是不同的平臺(tái)可執(zhí)行的機(jī)器碼必然不同,源代碼必然需要依據(jù)不同平臺(tái)再次被編譯.所以這并不是焦點(diǎn).

焦點(diǎn)并不是在編譯上,而是在對(duì)源文件的修改上,c語(yǔ)言經(jīng)常需要調(diào)用系統(tǒng)層面的API.但不同系統(tǒng)的api一般不同,因此為了支持不同的平臺(tái)c語(yǔ)言的源代碼需要根據(jù)不同的平臺(tái)修改源代碼,這是一個(gè)非常大的通電.

三軍;

java特征:

面向?qū)ο?封裝,繼承,多態(tài))

平臺(tái)無(wú)關(guān)性(jvm運(yùn)行,class文件)

語(yǔ)言(泛型,lambda)

類庫(kù)(集合,并發(fā),網(wǎng)絡(luò),io/nio)

jre(java運(yùn)行環(huán)境,JVM,類庫(kù))

JDK(java開發(fā)工具,包括JRE,javac,診斷工具)


java是解析運(yùn)行的嗎?

兩種都有.

1.java源代碼經(jīng)過(guò)javac編譯成.class文件

2..class文件經(jīng)過(guò)jvm編譯或解析運(yùn)行.

①解析:.class文件經(jīng)過(guò)jvm內(nèi)嵌的解析器解析執(zhí)行.

②編譯:存在JIT編譯器(即時(shí)編譯器)把經(jīng)常運(yùn)行的代碼作為熱點(diǎn)代碼,編譯為與本地平臺(tái)相關(guān)的代碼,并進(jìn)行各種層次的優(yōu)化.

③AOT編譯器,java 9提供的直接將所有代碼編譯成機(jī)器碼執(zhí)行.

jerry銀銀

首先,個(gè)人覺(jué)得這個(gè)題目非常抽象和籠統(tǒng),本身沒(méi)有標(biāo)準(zhǔn)答案.但是答案有好壞我的理解:

宏觀層面:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孤页,一起剝皮案震驚了整個(gè)濱河市遂庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌举户,老刑警劉巖蚪腐,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件超凳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怠惶,警方通過(guò)查閱死者的電腦和手機(jī)涨缚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)策治,“玉大人脓魏,你說(shuō)我怎么就攤上這事⊥ū梗” “怎么了茂翔?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)履腋。 經(jīng)常有香客問(wèn)我珊燎,道長(zhǎng),這世上最難降的妖魔是什么遵湖? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任悔政,我火速辦了婚禮,結(jié)果婚禮上延旧,老公的妹妹穿的比我還像新娘谋国。我一直安慰自己,他們只是感情好垄潮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布烹卒。 她就那樣靜靜地躺著闷盔,像睡著了一般弯洗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逢勾,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天牡整,我揣著相機(jī)與錄音,去河邊找鬼溺拱。 笑死逃贝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的迫摔。 我是一名探鬼主播沐扳,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼句占!你這毒婦竟也來(lái)了沪摄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杨拐,沒(méi)想到半個(gè)月后祈餐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哄陶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年帆阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屋吨。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜒谤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出离赫,到底是詐尸還是另有隱情芭逝,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布渊胸,位于F島的核電站旬盯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翎猛。R本人自食惡果不足惜胖翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望切厘。 院中可真熱鬧萨咳,春花似錦、人聲如沸疫稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遗座。三九已至舀凛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間途蒋,已是汗流浹背猛遍。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留号坡,地道東北人懊烤。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宽堆,于是被迫代替她去往敵國(guó)和親腌紧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法畜隶,類相關(guān)的語(yǔ)法壁肋,內(nèi)部類的語(yǔ)法逮光,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法墩划,線程的語(yǔ)...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • (一)Java部分 1涕刚、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,101評(píng)論 0 62
  • 每個(gè)使用Java的開發(fā)者都知道Java字節(jié)碼是在JRE中運(yùn)行(JRE: Java 運(yùn)行時(shí)環(huán)境)。JVM則是JRE中...
    燕京博士閱讀 1,406評(píng)論 0 6
  • Vincent_Hou閱讀 163評(píng)論 0 0
  • 1 2006年乙帮。初次見面的王塵與李暖的兩人杜漠。是非常狗血的。 同學(xué)校不同級(jí)應(yīng)該是沒(méi)有多大交流的察净。而且還是小學(xué)驾茴。 ...
    祈9閱讀 440評(píng)論 1 1