關(guān)于面試,95%會問道的Java面試題
金九銀十,很多小伙伴現(xiàn)在已經(jīng)開始為接下來的面試做準備了,刷了很多題,只等待面試官召喚的那一天。不過對于刷題來說,更重要的是了解面試的重點和技巧。
?對于Java面試以及進階的最佳學習方式莫過于刷題+博客+書籍+總結(jié),至于總結(jié)在于個人,實際上你面試的多了會發(fā)現(xiàn),面試其實并不難,主要是刷題的過程中有沒有深入的去思考,刷題是一個層次,思考又是另一個層次了。
這里總結(jié)了一系列大廠面試中常問的面試技術(shù)點,深入解析以及答案,希望可以為準備去面試的你保價護航。
Java面試基礎(chǔ)部分
面向?qū)ο蠛兔嫦蜻^程的區(qū)別
面向過程優(yōu)點:性能比面向?qū)ο蟾?,因為類調(diào)用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發(fā)、Linux/Unix等一般采用面向過程開發(fā),性能是最重要的因素。
缺點:沒有面向?qū)ο笠拙S護、易復用、易擴展
面向?qū)ο髢?yōu)點:易維護、易復用、易擴展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護
缺點:性能比面向過程低
2.Java語言有哪些特點
1.簡單易學;
2.面向?qū)ο螅ǚ庋b,繼承,多態(tài));
3.平臺無關(guān)性(Java虛擬機實現(xiàn)平臺無關(guān)性)
4.可靠性;
5.安全性;
6.支持多線程(C++語言沒有內(nèi)置的多線程機制,因此必須調(diào)用操作系統(tǒng)的多線程功能來進行多線程程序設(shè)計,而Java語言卻提供了多線程支持);
7.支持網(wǎng)絡(luò)編程并且很方便(Java語言誕生本身就是為簡化網(wǎng)絡(luò)編程設(shè)計的,因此Java語言不僅支持網(wǎng)絡(luò)編程而且很方便);
8.編譯與解釋并存;
3.關(guān)于JVMJDK和JRE最詳細通俗的解答
JVM
Java虛擬機(JVM)是運行Java字節(jié)碼的虛擬機。JVM有針對不同系統(tǒng)的特定實現(xiàn)(Windows,Linux,macOS),目的是使用相同的字節(jié)碼,它們都會給出相同的結(jié)果。
什么是字節(jié)碼?采用字節(jié)碼的好處是什么?
在Java中,JVM可以理解的代碼就叫做字節(jié)碼(即擴展名為.class的文件),它不面向任何特定的處理器,只面向虛擬機。Java語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。所以Java程序運行時比較高效,而且,由于字節(jié)碼并不專對一種特定的機器,因此,Java程序無須重新編譯便可在多種不同的計算機上運行。
Java程序從源代碼到運行一般有下面3步:
我們需要格外注意的是.class->機器碼這一步。在這一步j(luò)vm類加載器首先加載字節(jié)碼文件,然后通過解釋器逐行解釋執(zhí)行,這種方式的執(zhí)行速度會相對比較慢。而且,有些方法和代碼塊是經(jīng)常需要被調(diào)用的,也就是所謂的熱點代碼,所以后面引進了JIT編譯器,JIT屬于運行時編譯。當JIT編譯器完成第一次編譯后,其會將字節(jié)碼對應(yīng)的機器碼保存下來,下次可以直接使用。而我們知道,機器碼的運行效率肯定是高于Java解釋器的。這也解釋了我們?yōu)槭裁唇?jīng)常會說Java是編譯與解釋共存的語言。
? ?HotSpot采用了惰性評估(LazyEvaluation)的做法,根據(jù)二八定律,消耗大部分系統(tǒng)資源的只有那一小部分的代碼(熱點代碼),而這也就是JIT所需要編譯的部分。JVM會根據(jù)代碼每次被執(zhí)行的情況收集信息并相應(yīng)地做出一些優(yōu)化,因此執(zhí)行的次數(shù)越多,它的速度就越快。JDK9引入了一種新的編譯模式AOT(AheadofTimeCompilation),它是直接將字節(jié)碼編譯成機器碼,這樣就避免了JIT預(yù)熱等各方面的開銷。JDK支持分層編譯和AOT協(xié)作使用。但是,AOT編譯器的編譯質(zhì)量是肯定比不上JIT編譯器的??偨Y(jié):Java虛擬機(JVM)是運行Java字節(jié)碼的虛擬機。JVM有針對不同系統(tǒng)的特定實現(xiàn)(Windows,Linux,macOS),目的是使用相同的字節(jié)碼,它們都會給出相同的結(jié)果。字節(jié)碼和不同系統(tǒng)的JVM實現(xiàn)是Java語言“一次編譯,隨處可以運行”的關(guān)鍵所在。
JDK和JRE
JDK是JavaDevelopmentKit,它是功能齊全的JavaSDK。它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb)。它能夠創(chuàng)建和編譯程序。
JRE是Java運行時環(huán)境。它是運行已編譯Java程序所需的所有內(nèi)容的集合,包括Java虛擬機(JVM),Java類庫,java命令和其他的一些基礎(chǔ)構(gòu)件。但是,它不能用于創(chuàng)建新程序。
如果你只是為了運行一下Java程序的話,那么你只需要安裝JRE就可以了。如果你需要進行一些Java編程方面的工作,那么你就需要安裝JDK了。但是,這不是絕對的。有時,即使您不打算在計算機上進行任何Java開發(fā),仍然需要安裝JDK。例如,如果要使用JSP部署Web應(yīng)用程序,那么從技術(shù)上講,您只是在應(yīng)用程序服務(wù)器中運行Java程序。那你為什么需要JDK呢?因為應(yīng)用程序服務(wù)器會將JSP轉(zhuǎn)換為Javaservlet,并且需要使用JDK來編譯servlet。
4.OracleJDK和OpenJDK的對比
可能在看這個問題之前很多人和我一樣并沒有接觸和使用過OpenJDK。那么Oracle和OpenJDK之間是否存在重大差異?下面通過我通過我收集到一些資料對你解答這個被很多人忽視的問題。
關(guān)于JVM,JDK,JRE和OpenJDK之間的區(qū)別,Oracle博客帖子在2012年有一個更詳細的答案:
問:OpenJDK存儲庫中的源代碼與用于構(gòu)建OracleJDK的代碼之間有什么區(qū)別?
答:非常接近-我們的OracleJDK版本構(gòu)建過程基于OpenJDK7構(gòu)建,只添加了幾個部分,例如部署代碼,其中包括Oracle的Java插件和JavaWebStart的實現(xiàn),以及一些封閉的源代碼派對組件,如圖形光柵化器,一些開源的第三方組件,如Rhino,以及一些零碎的東西,如附加文檔或第三方字體。展望未來,我們的目的是開源OracleJDK的所有部分,除了我們考慮商業(yè)功能的部分。
總結(jié):
OracleJDK版本將每三年發(fā)布一次,而OpenJDK版本每三個月發(fā)布一次;
OpenJDK是一個參考模型并且是完全開源的,而OracleJDK是OpenJDK的一個實現(xiàn),并不是完全開源的;
3.OracleJDK比OpenJDK更穩(wěn)定。OpenJDK和OracleJDK的代碼幾乎相同,但OracleJDK有更多的類和一些錯誤修復。因此,如果您想開發(fā)企業(yè)/商業(yè)軟件,我建議您選擇OracleJDK,因為它經(jīng)過了徹底的測試和穩(wěn)定。某些情況下,有些人提到在使用OpenJDK可能會遇到了許多應(yīng)用程序崩潰的問題,但是,只需切換到OracleJDK就可以解決問題;
4.頂級公司正在使用OracleJDK,例如AndroidStudio,Minecraft和IntelliJIDEA開發(fā)工具,其中OpenJDK不太受歡迎;
5.在響應(yīng)性和JVM性能方面,OracleJDK與OpenJDK相比提供了更好的性能;
6.OracleJDK不會為即將發(fā)布的版本提供長期支持,用戶每次都必須通過更新到最新版本獲得支持來獲取最新版本;
7.OracleJDK根據(jù)二進制代碼許可協(xié)議獲得許可,而OpenJDK根據(jù)GPLv2許可獲得許可。
5.Java和C++的區(qū)別
我知道很多人沒學過C++,但是面試官就是沒事喜歡拿咱們Java和C++比呀!沒辦法?。?!就算沒學過C++,也要記下來!
?都是面向?qū)ο蟮恼Z言,都支持封裝、繼承和多態(tài)
?Java不提供指針來直接訪問內(nèi)存,程序內(nèi)存更加安全
?Java的類是單繼承的,C++支持多重繼承;雖然Java的類不可以多繼承,但是接口可以多繼承。
?Java有自動內(nèi)存管理機制,不需要程序員手動釋放無用內(nèi)存
——————————————————-————————————-——



篇幅有限,后續(xù)還有很多的內(nèi)容就不一?一在這里羅列了,我已經(jīng)整理了完整的電子版,都是2022最新的資源,值得收藏,有需要的朋友可以找我哦~(一鍵三連,感謝支持吖)