摘要:語(yǔ)言通過(guò)字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語(yǔ)言執(zhí)行效率低的問(wèn)題,同時(shí)又保留了解釋型語(yǔ)言可移植的特點(diǎn)。有針對(duì)不同系統(tǒng)的特定實(shí)現(xiàn),,,目的是使用相同的字節(jié)碼,它們都會(huì)給出相同的結(jié)果。
一、面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別
面向過(guò)程
優(yōu)點(diǎn): 性能比面向?qū)ο蟾?,因?yàn)轭?lèi)調(diào)用時(shí)需要實(shí)例化,開(kāi)銷(xiāo)比較大,比較消耗資源;比如單片機(jī)、嵌入式開(kāi)發(fā)、Linux/Unix 等一般采用面向過(guò)程開(kāi)發(fā),性能是最重要的因素。
缺點(diǎn): 沒(méi)有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展
面向?qū)ο?/strong>
優(yōu)點(diǎn): 易維護(hù)、易復(fù)用、易擴(kuò)展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護(hù)
缺點(diǎn): 性能比面向過(guò)程低
二、Java 語(yǔ)言有哪些特點(diǎn):簡(jiǎn)單易學(xué);面向?qū)ο螅ǚ庋b,繼承,多態(tài));平臺(tái)無(wú)關(guān)性( Java 虛擬機(jī)實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性);可靠性;安全性;支持多線程;支持網(wǎng)絡(luò)編程并且很方便;編譯與解釋并存;
三、關(guān)于 JVM JDK 和 JRE 最詳細(xì)通俗的解答JVM
Java 虛擬機(jī)(JVM)是運(yùn)行 Java 字節(jié)碼的虛擬機(jī)。JVM 有針對(duì)不同系統(tǒng)的特定實(shí)現(xiàn)(Windows,Linux,macOS),目的是使用相同的字節(jié)碼,它們都會(huì)給出相同的結(jié)果。
什么是字節(jié)碼?采用字節(jié)碼的好處是什么?
在 Java 中,JVM 可以理解的代碼就叫做字節(jié)碼(即擴(kuò)展名為 .class 的文件),它不面向任何特定的處理器,只面向虛擬機(jī)。Java 語(yǔ)言通過(guò)字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語(yǔ)言執(zhí)行效率低的問(wèn)題,同時(shí)又保留了解釋型語(yǔ)言可移植的特點(diǎn)。所以 Java 程序運(yùn)行時(shí)比較高效,而且,由于字節(jié)碼并不專(zhuān)對(duì)一種特定的機(jī)器,因此,Java 程序無(wú)須重新編譯便可在多種不同的計(jì)算機(jī)上運(yùn)行。
Java 程序從源代碼到運(yùn)行一般有下面 3 步:
我們需要格外注意的是 .class->機(jī)器碼 這一步。在這一步 jvm 類(lèi)加載器首先加載字節(jié)碼文件,然后通過(guò)解釋器逐行解釋執(zhí)行,這種方式的執(zhí)行速度會(huì)相對(duì)比較慢。而且,有些方法和代碼塊是經(jīng)常需要被調(diào)用的,也就是所謂的熱點(diǎn)代碼,所以后面引進(jìn)了 JIT 編譯器,JIT 屬于運(yùn)行時(shí)編譯。當(dāng) JIT 編譯器完成第一次編譯后,其會(huì)將字節(jié)碼對(duì)應(yīng)的機(jī)器碼保存下來(lái),下次可以直接使用。而我們知道,機(jī)器碼的運(yùn)行效率肯定是高于 Java 解釋器的。這也解釋了我們?yōu)槭裁唇?jīng)常會(huì)說(shuō) Java 是編譯與解釋共存的語(yǔ)言。
HotSpot 采用了惰性評(píng)估(Lazy Evaluation)的做法,根據(jù)二八定律,消耗大部分系統(tǒng)資源的只有那一小部分的代碼(熱點(diǎn)代碼),而這也就是 JIT 所需要編譯的部分。JVM 會(huì)根據(jù)代碼每次被執(zhí)行的情況收集信息并相應(yīng)地做出一些優(yōu)化,因此執(zhí)行的次數(shù)越多,它的速度就越快。JDK 9 引入了一種新的編譯模式AOT(Ahead of Time Compilation),它是直接將字節(jié)碼編譯成機(jī)器碼,這樣就避免了 JIT 預(yù)熱等各方面的開(kāi)銷(xiāo)。JDK 支持分層編譯和 AOT 協(xié)作使用。但是 ,AOT 編譯器的編譯質(zhì)量是肯定比不上 JIT 編譯器的。
總結(jié):Java 虛擬機(jī)(JVM)是運(yùn)行 Java 字節(jié)碼的虛擬機(jī)。JVM 有針對(duì)不同系統(tǒng)的特定實(shí)現(xiàn)(Windows,Linux,macOS),目的是使用相同的字節(jié)碼,它們都會(huì)給出相同的結(jié)果。字節(jié)碼和不同系統(tǒng)的 JVM 實(shí)現(xiàn)是 Java 語(yǔ)言“一次編譯,隨處可以運(yùn)行”的關(guān)鍵所在。
JDK 和 JRE
JDK 是 Java Development Kit,它是功能齊全的 Java SDK。它擁有 JRE 所擁有的一切,還有編譯器(javac)和工具(如 javadoc 和 jdb)。它能夠創(chuàng)建和編譯程序。
JRE 是 Java 運(yùn)行時(shí)環(huán)境。它是運(yùn)行已編譯 Java 程序所需的所有內(nèi)容的集合,包括 Java 虛擬機(jī)(JVM),Java 類(lèi)庫(kù),java 命令和其他的一些基礎(chǔ)構(gòu)件。但是,它不能用于創(chuàng)建新程序。
如果你只是為了運(yùn)行一下 Java 程序的話,那么你只需要安裝 JRE 就可以了。如果你需要進(jìn)行一些 Java 編程方面的工作,那么你就需要安裝 JDK 了。但是,這不是絕對(duì)的。有時(shí),即使您不打算在計(jì)算機(jī)上進(jìn)行任何 Java 開(kāi)發(fā),仍然需要安裝 JDK。例如,如果要使用 JSP 部署 Web 應(yīng)用程序,那么從技術(shù)上講,您只是在應(yīng)用程序服務(wù)器中運(yùn)行 Java 程序。那你為什么需要 JDK 呢?因?yàn)閼?yīng)用程序服務(wù)器會(huì)將 JSP 轉(zhuǎn)換為 Java servlet,并且需要使用 JDK 來(lái)編譯servlet。
四、Oracle JDK 和 OpenJDK 的對(duì)比可能在看這個(gè)問(wèn)題之前很多人和我一樣并沒(méi)有接觸和使用過(guò) OpenJDK 。那么Oracle 和 OpenJDK 之間是否存在重大差異?下面通過(guò)我通過(guò)我收集到一些資料對(duì)你解答這個(gè)被很多人忽視的問(wèn)題。
對(duì)于 Java 7,沒(méi)什么關(guān)鍵的地方。OpenJDK 項(xiàng)目主要基于 Sun 捐贈(zèng)的 HotSpot源代碼。此外,OpenJDK 被選為 Java 7 的參考實(shí)現(xiàn),由 Oracle 工程師維護(hù)。關(guān)于 JVM,JDK,JRE 和OpenJDK 之間的區(qū)別,Oracle 博客帖子在 2012 年有一個(gè)更詳細(xì)的答案:
問(wèn):OpenJDK 存儲(chǔ)庫(kù)中的源代碼與用于構(gòu)建 Oracle JDK 的代碼之間有什么區(qū)別?
答:非常接近 - 我們的 Oracle JDK 版本構(gòu)建過(guò)程基于 OpenJDK 7 構(gòu)建,只添加了幾個(gè)部分,例如部署代碼,其中包括 Oracle 的 Java 插件和 Java WebStart的實(shí)現(xiàn),以及一些封閉的源代碼派對(duì)組件,如圖形光柵化器,一些開(kāi)源的第三方組件,如 Rhino,以及一些零碎的東西,如附加文檔或第三方字體。展望未來(lái),我們的目的是開(kāi)源 Oracle JDK 的所有部分,除了我們考慮商業(yè)功能的部分。
總結(jié):
Oracle JDK 版本將每三年發(fā)布一次,而 OpenJDK 版本每三個(gè)月發(fā)布一次;
OpenJDK 是一個(gè)參考模型并且是完全開(kāi)源的,而 Oracle JDK 是OpenJDK 的一個(gè)實(shí)現(xiàn),并不是完全開(kāi)源的;
Oracle JDK 比 OpenJDK 更穩(wěn)定。OpenJDK 和 Oracle JDK 的代碼幾乎相同,但 Oracle JDK 有更多的類(lèi)和一些錯(cuò)誤修復(fù)。因此,如果您想開(kāi)發(fā)企業(yè)/商業(yè)軟件,我建議您選擇 Oracle JDK,因?yàn)樗?jīng)過(guò)了徹底的測(cè)試和穩(wěn)定。某些情況下,有些人提到在使用 OpenJDK 可能會(huì)遇到了許多應(yīng)用程序崩潰的問(wèn)題,但是,只需切換到 Oracle JDK 就可以解決問(wèn)題;
頂級(jí)公司正在使用 Oracle JDK,例如 Android Studio,Minecraft 和IntelliJ IDEA 開(kāi)發(fā)工具,其中 Open JDK 不太受歡迎;
在響應(yīng)性和 JVM 性能方面,Oracle JDK 與 OpenJDK 相比提供了更好的性能;
Oracle JDK 不會(huì)為即將發(fā)布的版本提供長(zhǎng)期支持,用戶(hù)每次都必須通過(guò)更新到最新版本獲得支持來(lái)獲取最新版本;
Oracle JDK 根據(jù)二進(jìn)制代碼許可協(xié)議獲得許可,而 OpenJDK 根據(jù) GPLv2 許可獲得許可。
五、Java 和 C++的區(qū)別我知道很多人沒(méi)學(xué)過(guò) C++,但是面試官就是沒(méi)事喜歡拿咱們 Java 和 C++ 比呀!沒(méi)辦法?。?!就算沒(méi)學(xué)過(guò) C++,也要記下來(lái)!
? 都是面向?qū)ο蟮恼Z(yǔ)言,都支持封裝、繼承和多態(tài)
? Java 不提供指針來(lái)直接訪問(wèn)內(nèi)存,程序內(nèi)存更加安全
? Java 的類(lèi)是單繼承的,C++ 支持多重繼承;雖然 Java 的類(lèi)不可以多繼承,但是接口可以多繼承。
? Java 有自動(dòng)內(nèi)存管理機(jī)制,不需要程序員手動(dòng)釋放無(wú)用內(nèi)存
六、什么是 Java 程序的主類(lèi) 應(yīng)用程序和小程序的主類(lèi)有何不同一個(gè)程序中可以有多個(gè)類(lèi),但只能有一個(gè)類(lèi)是主類(lèi)。在 Java 應(yīng)用程序中,這個(gè)主類(lèi)是指包含 main()方法的類(lèi)。而在 Java 小程序中,這個(gè)主類(lèi)是一個(gè)繼承自系統(tǒng)類(lèi) JApplet 或 Applet 的子類(lèi)。應(yīng)用程序的主類(lèi)不一定要求是 public類(lèi),但小程序的主類(lèi)要求必須是 public 類(lèi)。主類(lèi)是 Java 程序執(zhí)行的入口點(diǎn)。
七. Java 應(yīng)用程序與小程序之間有那些差別簡(jiǎn)單說(shuō)應(yīng)用程序是從主線程啟動(dòng)(也就是 main() 方法)。applet 小程序沒(méi)有main 方法,主要是嵌在瀏覽器頁(yè)面上運(yùn)行(調(diào)用 init()線程或者 run()來(lái)啟動(dòng)),嵌入瀏覽器這點(diǎn)跟 flash 的小游戲類(lèi)似。
八. 字符型常量和字符串常量的區(qū)別形式上: 字符常量是單引號(hào)引起的一個(gè)字符 字符串常量是雙引號(hào)引起的若干個(gè)字符
含義上: 字符常量相當(dāng)于一個(gè)整形值( ASCII 值),可以參加表達(dá)式運(yùn)算 字符串常量代表一個(gè)地址值(該字符串在內(nèi)存中存放位置)
占內(nèi)存大小 字符常量只占 2 個(gè)字節(jié) 字符串常量占若干個(gè)字節(jié)(至少一個(gè)字符結(jié)束標(biāo)志) (注意: char 在 Java 中占兩個(gè)字節(jié))
九、 構(gòu)造器 Constructor 是否可被 override在講繼承的時(shí)候我們就知道父類(lèi)的私有屬性和構(gòu)造方法并不能被繼承,所以Constructor 也就不能被 override(重寫(xiě)),但是可以 overload(重載),所以你可以看到一個(gè)類(lèi)中有多個(gè)構(gòu)造函數(shù)的情況。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74459.html
摘要:好不容易在月號(hào)這天中午點(diǎn)左右接到了來(lái)自阿里的面試電話。這里會(huì)不斷收集和更新基礎(chǔ)相關(guān)的面試題,目前已收集題。面試重難點(diǎn)的和的打包過(guò)程多線程機(jī)制機(jī)制系統(tǒng)啟動(dòng)過(guò)程,啟動(dòng)過(guò)程等等掃清面試障礙最新面試經(jīng)驗(yàn)分享,此為第一篇,開(kāi)篇。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 各大公司 Java 后端開(kāi)發(fā)面試題總結(jié) 各大公司 Jav...
摘要:排序算法和集合工具類(lèi)排序算法和集合工具類(lèi)。面試官總是問(wèn)排序算法也不是在難為你,而是在考察你的編程功底。你首先要理解多線程不僅僅是和那么簡(jiǎn)單,整個(gè)并發(fā)包下面的工具都是在為多線程服務(wù)。 去年的這個(gè)時(shí)候樓主通過(guò)兩個(gè)月的復(fù)習(xí)拿到了阿里巴巴的 offer,有一些運(yùn)氣,也有一些心得,借著跳槽季來(lái)臨特此分享出來(lái)。簡(jiǎn)單梳理一下我的復(fù)習(xí)思路,同時(shí)也希望和大家一起交流討論,一起學(xué)習(xí),如果不對(duì)之處歡迎指正一...
摘要:我自己總結(jié)的學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,已經(jīng)開(kāi)源,目前已經(jīng)。面試官那你都了解里面的哪些東西呢我哈哈哈這可是我的強(qiáng)項(xiàng),從,說(shuō)到,,又說(shuō)到線程池,分別說(shuō)了底層實(shí)現(xiàn)和項(xiàng)目中的應(yīng)用。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,已經(jīng)開(kāi)源,目前已經(jīng) 35k+ Star。會(huì)一直完善下去,歡迎建議和指導(dǎo),同時(shí)也歡迎Star: https://github.com/Snailclimb... ...
摘要:面經(jīng)因?yàn)槲彝耆珱](méi)有面試經(jīng)驗(yàn),從來(lái)沒(méi)有經(jīng)歷過(guò)面試,于是想著在去這類(lèi)大公司面試之前先找成都的小公司練練手,積累點(diǎn)面試經(jīng)驗(yàn)。于是三月份開(kāi)始就有成都的小公司開(kāi)始約我面試。 前序 從我高考成績(jī)出來(lái)那一刻開(kāi)始,從我在高考志愿上填上計(jì)算機(jī)科學(xué)與技術(shù)這幾個(gè)當(dāng)時(shí)在心中堪稱(chēng)神圣的幾個(gè)字開(kāi)始,我就已經(jīng)把進(jìn)入中國(guó)互聯(lián)網(wǎng)最高殿堂BAT作為我整個(gè)大學(xué)奮斗的目標(biāo),哪怕我就讀的是一所位于內(nèi)陸的雙非一本大學(xué)我也認(rèn)為我能...
閱讀 2380·2021-11-17 09:33
閱讀 877·2021-10-13 09:40
閱讀 606·2019-08-30 15:54
閱讀 810·2019-08-29 15:38
閱讀 2442·2019-08-28 18:15
閱讀 2505·2019-08-26 13:38
閱讀 1871·2019-08-26 13:36
閱讀 2158·2019-08-26 11:36