java面試1、1.1基礎

免責聲明:
    本文內容多來自網絡文章,轉載爲我的收藏,分享知識,若有侵權,請聯繫 博主進行刪除。

基礎篇

1.1Java基礎

  • 面向對象的特徵:繼承、封裝和多態

三大特性是:封裝,繼承,多態java

所謂封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。封裝是面向對象的特徵之一,是對象和類概念的主要特性。 簡單的說,一個類就是一個封裝了數據以及操做這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據能夠是私有的,不能被外界訪問。經過這種方式,對象對內部數據提供了不一樣級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。程序員

所謂繼承是指可讓某個類型的對象得到另外一個類型的對象的屬性的方法。它支持按級分類的概念。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。 經過繼承建立的新類稱爲「子類」或「派生類」,被繼承的類稱爲「基類」、「父類」或「超類」。繼承的過程,就是從通常到特殊的過程。要實現繼承,能夠經過「繼承」(Inheritance)和「組合」(Composition)來實現。繼承概念的實現方式有二類:實現繼承與接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、可是子類必須提供實現的能力;redis

所謂多態就是指一個類實例的相同方法在不一樣情形有不一樣表現形式。多態機制使具備不一樣內部結構的對象能夠共享相同的外部接口。這意味着,雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,它們(那些操做)能夠經過相同的方式予以調用。算法

  • 常見到的runtime exception

算術異常類:ArithmeticExecption
空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException
數組越界異常:IndexOutOfBoundsException
操做數據庫異常:SQLException
輸入輸出異常:IOExceptionsql

  • int 和 Integer 有什麼區別,Integer的值緩存範圍
  • 包裝類,裝箱和拆箱

區別:
int 是基本數據類型,直接存數值,進行初始化時 int 類的變量初始值爲 0 ;
Integer 是對象,用一個引用指向這個對象,Integer 的變量初始化值爲 null 。數據庫

兩種數據類型:
原始數據類型:分別:boolean、byte 、short、char、int、float、double、long;
引用數據類型,分爲數組 和 接口。編程

爲了編程開發的方便,Java 仍是引入了基本數據類型,可是爲了可以將這些基本數據類型當成對象操做,Java 爲每個基本數據類型都引入了對應的 包裝類型(wrapper class),int的包裝類就是 Integer,從 Java5 開始引入了自動裝箱和自動拆箱,使得兩者能夠相互轉換。後端

原始數據類型:boolean 、char、byte、short、int、long 、float、double
封裝類類型: Boolean、Character、Byte、Short、Integer、Long、Float、Doubleapi

自動裝箱:將基本數據類從新轉換爲對象
自動拆箱:將對象從新轉換爲基本數據類型數組

緩存:
歸結於Java對於Integer 與 int 的自動裝箱和拆箱的設計,是一種模式:叫 享元模式(flyweight)。
加大對簡單數字的重利用,Java 定義在自動裝箱時對於值在 -128~127 之間的值,他們被裝箱爲Integer 對象後,會存在內存中被重用,始終只有一個對象。

參考:int 和 Integer

  • String、StringBuilder、StringBuffer

區別:
一、String是字符串常量,而StringBuffer和StringBuilder是字符串變量。由String建立的字符內容是不可改變的,而由StringBuffer和StringBuidler建立的字符內容是能夠改變的。
二、StringBuffer是線程安全的,而StringBuilder是非線程安全的。StringBuilder是從JDK 5開始,爲StringBuffer類補充的一個單線程的等價類。咱們在使用時應優先考慮使用StringBuilder,由於它支持StringBuffer的全部操做,可是由於它不執行同步,不會有線程安全帶來額外的系統消耗,因此速度更快。

爲何String不可變:
雖然String、StringBuffer和StringBuilder都是final類,它們生成的對象都是不可變的,並且它們內部也都是靠char數組實現的,可是不一樣之處在於,String類中定義的char數組是final的,而StringBuffer和StringBuilder都是繼承自AbstractStringBuilder類,它們的內部實現都是靠這個父類完成的,而這個父類中定義的char數組只是一個普通是私有變量,能夠用append追加。由於AbstractStringBuilder實現了Appendable接口。

String類不可變性的好處:
1.只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現能夠在運行時節約不少heap空間,由於不一樣的字符串變量都指向池中的同一個字符串。但若是字符串是可變的,那麼String interning將不能實現(譯者注:String interning是指對不一樣的字符串僅僅只保存一個,即不會保存多個相同的字符串。),由於這樣的話,若是變量改變了它的值,那麼其它指向這個值的變量的值也會一塊兒改變。
2.若是字符串是可變的,那麼會引發很嚴重的安全問題。譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來得到數據庫的鏈接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。由於字符串是不可變的,因此它的值是不可改變的,不然黑客們能夠鑽到空子,改變字符串指向的對象的值,形成安全漏洞。
3.由於字符串是不可變的,因此是多線程安全的,同一個字符串實例能夠被多個線程共享。這樣便不用由於線程安全問題而使用同步。字符串本身即是線程安全的。
4.類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個值被改爲了myhacked.Connection,那麼會對你的數據庫形成不可知的破壞。
5.由於字符串是不可變的,因此在它建立的時候hashcode就被緩存了,不須要從新計算。這就使得字符串很適合做爲Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵每每都使用字符串。

  • 重載和重寫的區別

定義:

重載:
Java的方法重載,就是在類中能夠建立多個方法,它們具備相同的名字,但具備不一樣的參數和不一樣的定義。
重寫:
父類與子類之間的多態性,對父類的函數進行從新定義。
子類中的方法與父類中的某一方法具備相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。

特色:

重載:
一、在使用重載時只能經過不一樣的參數樣式(方法簽名)。例如,不一樣的參數類型,不一樣的參數個數,不一樣的參數順序。
二、不能經過訪問權限、返回類型、拋出的異常進行重載。
三、方法的異常類型和數目不會對重載形成影響。
四、對於繼承來講,若是某一方法在父類中是訪問權限是priavte,那麼就不能在子類對其進行重載,若是定義的話,也只是定義了一個新方法,而不會達到重載的效果。
重寫:
一、覆蓋的方法的標誌必需要和被覆蓋的方法的標誌徹底匹配,才能達到覆蓋的效果。
二、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致。
三、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類。
四、被覆蓋的方法不能爲private,不然在其子類中只是新定義了一個方法,並無對其進行覆蓋。
五、方法被定義爲final不能被重寫。

  • Java普通類、抽象類與接口的區別

抽象類和接口
抽象類與接口都是用於功能的抽象。
一、方法: 接口只能有抽象方法,抽象類能夠有抽象方法和非抽象方法。Java8之後,接口能夠直接定義default和static方法了。抽象類能夠有protect和private方法。
二、成員變量:接口中的成員變量默認是static和final的,抽象類能夠像常規的對象同樣定義各類成員變量。能夠是非static和final的。
三、實現:接口不能實現其餘的接口,只能繼承一個其它的接口。抽象類能夠實現多個接口。
四、構造器:抽象類能夠有構造器,接口不能有構造器。
五、main方法: 抽象類能夠有main方法,而且咱們能夠運行它。接口不能有main方法。
六、速度:抽象類速度更快一些,接口須要時間尋找類中的實現方法。

普通類和抽象類
包含抽象方法的類稱爲抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類同樣,一樣能夠擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:
1)抽象方法必須爲public或者protected(由於若是爲private,則不能被子類繼承,子類便沒法實現該方法),缺省狀況下默認爲public。
2)抽象類不能用來建立對象;
3)若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。若是子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。

  • 說說反射的用途及實現

反射的核心是JVM在運行時才動態加載類或調用方法/訪問屬性,它不須要事先(寫代碼的時候或編譯期)知道運行對象是誰。

Java反射框架主要提供如下功能:
1.在運行時判斷任意一個對象所屬的類;
2.在運行時構造任意一個類的對象;
3.在運行時判斷任意一個類所具備的成員變量和方法(經過反射甚至能夠調用private方法);
4.在運行時調用任意一個對象的方法。

反射的主要用途
一、反射最重要的用途就是開發各類通用框架。

基本反射功能的實現(反射相關的類通常都在java.lang.relfect包裏):
一、得到Class對象
      使用Class類的forName靜態方法
      直接獲取某一個對象的class
     調用某個對象的getClass()方法
二、判斷是否爲某個類的實例
     用instanceof關鍵字來判斷是否爲某個類的實例
三、建立實例
      使用Class對象的newInstance()方法來建立Class對象對應類的實例。
      先經過Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來建立實例。
四、獲取方法
    getDeclaredMethods()
getMethods()
五、獲取構造器信息
     getDeclaredConstructors()
getConstructors()
六、獲取類的成員變量(字段)信息
   getFiled: 訪問公有的成員變量
     getDeclaredField:全部已聲明的成員變量。但不能獲得其父類的成員變量
     getFileds和getDeclaredFields用法
七、調用方法
invoke()
八、利用反射建立數組
 Array.newInstance()

注意:
因爲反射會額外消耗必定的系統資源,所以若是不須要動態地建立一個對象,那麼就不須要用反射。
另外,反射調用方法時能夠忽略權限檢查,所以可能會破壞封裝性而致使安全問題。

  • 說說自定義註解的場景及實現

  • HTTP請求的GET與POST方式的區別

一、
GET請求:
請求的數據會附加在URL以後,以?分割URL和傳輸數據,多個參數用&鏈接。URL的編碼格式採用的是ASCII 編碼,而不是uniclde,便是說全部的非ASCII字符都要編碼以後再傳輸。
POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數 據。
所以,GET請求的數據會暴露在地址欄中,而POST請求則不會。
二、傳輸數據的大小
在HTTP規範中,沒有對URL的長度和傳輸的數據大小進行限制。可是在實際開發過程當中,對於GET,特定的 瀏覽器和服務器對URL的長度有限制。所以,在使用GET請求時,傳輸數據會受到URL長度的限制。
對於POST,因爲不是URL傳值,理論上是不會受限制的,可是實際上各個服務器會規定對POST提交數據大小進 行限制,Apache、IIS都有各自的配置。
三、安全性
POST的安全性比GET的高。這裏的安全是指真正的安全,而不一樣於上面GET提到的安全方法中的安全,上面 提到的安全僅僅是不修改服務器的數據。好比,在進行登陸操做,經過GET請求,用戶名和密碼都會暴露再URL 上,由於登陸頁面有可能被瀏覽器緩存以及其餘人查看瀏覽器的歷史記錄的緣由,此時的用戶名和密碼就很容易被 他人拿到了。除此以外,GET請求提交的數據還可能會形成Cross-site request frogery攻擊
四、HTTP中的GET,POST,SOAP協議都是在HTTP上運行的

  • Session與Cookie區別

Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息。如何識別特定的客戶呢?cookie就能夠作到。每次HTTP請求時,客戶端都會發送相應的Cookie信息到服務端。它的過時時間能夠任意設置,若是你不主動清除它,在很長一段時間裏面均可以保留着,即使這之間你把電腦關機了。

Session是在無狀態的HTTP協議下,服務端記錄用戶狀態時用於標識具體用戶的機制。它是在服務端保存的用來跟蹤用戶的狀態的數據結構,能夠保存在文件、數據庫或者集羣中。在瀏覽器關閉後此次的Session就消失了,下次打開就再也不擁有這個Session。其實並非Session消失了,而是Session ID變了,服務器端可能仍是存着你上次的Session ID及其Session 信息,只是他們是無主狀態,也許一段時間後會被刪除。
若是你的站點是多節點部署,使用Nginx作負載均衡,那麼有可能會出現Session丟失的狀況(好比,突然就處於未登陸狀態)。這時可使用IP負載均衡(IP綁定 ip_hash,每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決Session的問題),或者將Session信息存儲在集羣中。在大型的網站中,通常會有專門的Session服務器集羣,用來保存用戶會話,這時可使用緩存服務好比Memcached或者Redis之類的來存放Session。

區別:
一、Cookie 在客戶端(瀏覽器),Session 在服務器端。
二、Cookie的安全性通常,他人可經過分析存放在本地的Cookie並進行Cookie欺騙。在安全性第一的前提下,選擇Session更優。重要交互信息好比權限等就要放在Session中,通常的信息記錄放Cookie就行了。
三、單個Cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個Cookie。
四、Session 能夠放在 文件、數據庫或內存中,好比在使用Node時將Session保存在redis中。因爲必定時間內它是保存在服務器上的,當訪問增多時,會較大地佔用服務器的性能。考慮到減輕服務器性能方面,應當適時使用Cookie。
五、Session 的運行依賴Session ID,而 Session ID 是存在 Cookie 中的,也就是說,若是瀏覽器禁用了 Cookie,Session 也會失效(可是能夠經過其它方式實現,好比在 url 中傳遞 Session ID)。
六、用戶驗證這種場合通常會用 Session。所以,維持一個會話的核心就是客戶端的惟一標識,即Session ID。

注意:
HttpSession默認使用Cookie進行保存SessionID,當客戶端禁用了Cookie以後,能夠經過URL重寫的方式進行實現。
能夠經過response.encodeURL(url) 進行實現
API對encodeURL的結束爲,當瀏覽器支持Cookie時,url不作任何處理;當瀏覽器不支持Cookie的時候,將會重寫URL將SessionID拼接到訪問地址後。

用途:
Cookies:
一、記住密碼,下次自動登陸。
二、購物車功能。
三、記錄用戶瀏覽數據,進行商品(廣告)推薦。

Session:
一、判斷用戶是否登陸。
二、購物車功能。

  • 列出本身經常使用的JDK包

java.lang: 這個是系統的基礎類,好比String、Math、Integer、System和Thread, 提供經常使用功能。
java.io: 這裏面是全部輸入輸出有關的類,好比文件操做,輸入輸出流等
java.net: 這裏面是與網絡有關的類,好比URL,URLConnection、URLEncoder等。
java.util : 這個是系統輔助類,特別是集合類Collection,List,Map,Set;Date、UUID、regex(正則)。
java.sql: 這個是數據庫操做的類,Connection, Statememt,ResultSet等
java.math:數學相關,BigDecimal、
javax.persistence:JPA相關類
javax.validation:數據校驗,傳參、結果
javax.servlet:servlet開發
javax.servlet.http:爲基於Http協議的servlet開發提供便利

  • MVC設計思想

MVC是一種軟件架構的思想,將一個軟件按照模型、視圖、控制器進行劃分。其中,模型用來封裝業務邏輯,視圖用來實現表示邏輯,控制器用來協調模型與視圖
(視圖要經過控制器來調用模型,模型返回的處理結果也要先交給控制器,由控制器來選擇合適的視圖來顯示 處理結果)。
        1)模型: 業務邏輯包含了業務數據的加工與處理以及相應的基礎服務(爲了保證業務邏輯可以正常進行的事務、安全、權限、日誌等等的功能模塊)
        2)視圖:展示模型處理的結果;另外,還要提供相應的操做界面,方便用戶使用。
        3)控制器:視圖發請求給控制器,由控制器來選擇相應的模型來處理;模型返回的結果給控制器,由控制器選擇合適的視圖。

  • equals與==的區別

== 的做用:
  基本類型:比較的就是值是否相同
  引用類型:比較的就是地址值是否相同
equals 的做用:
  引用類型:默認狀況下,比較的是地址值。
注:不過,咱們能夠根據狀況本身重寫該方法。通常重寫都是自動生成,比較對象的成員變量值是否相同

注意字符串緩衝池、Integer緩存池~

  • equals重寫原則

自反性:對於任何非null的引用值x,x.equals(x)應返回true。
對稱性:對於任何非null的引用值x與y,當且僅當:y.equals(x)返回true時,x.equals(y)才返回true。
傳遞性:對於任何非null的引用值x、y與z,若是y.equals(x)返回true,y.equals(z)返回true,那麼x.equals(z)也應返回true。
一致性:對於任何非null的引用值x與y,假設對象上equals比較中的信息沒有被修改,則屢次調用x.equals(y)始終返回true或者始終返回false。
對於任何非空引用值x,x.equal(null)應返回false。

  • hashCode和equals方法的區別與聯繫

HashCode 只是在須要用到哈希算法的數據結構中才有用,好比 HashSet, HashMap 和 Hashtable

原則:
一、在 Java 應用程序執行期間,在對同一對象屢次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另外一次執行,該整數無需保持一致。
二、若是根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每一個對象調用 hashCode 方法都必須生成相同的整數結果。
三、若是根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法 不要求 必定生成不一樣的整數結果。可是,程序員應該意識到,爲不相等的對象生成不一樣整數結果能夠提升哈希表的性能。

通常來說,equals 這個方法是給用戶調用的,而 hashcode 方法通常用戶不會去調用 ;
當一個對象類型做爲集合對象的元素時,那麼這個對象應該擁有本身的equals()和hashCode()方法,保證不重複,並且要遵照前面所說的幾個原則。

  • 什麼是Java序列化(串行化)和反序列化(並行化),如何實現Java序列化?或者請解釋Serializable 接口的做用

不管何種類型的數據,都是以二進制的形式在網絡上傳送,爲了由一個進程把Java對象發送給另外一個進程,須要把其轉換爲字節序列才能在網絡上傳送,把JAVA對象轉換爲字節序列的過程就稱爲對象的序列化;
將字節序列恢復成Java對象的過程稱爲對象的反序列化。

序列化的實現:將須要被序列化的類實現Serializable接口,而後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就能夠將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

jdk api 文檔裏面關於接口 Serializable 的描述:
類經過實現 java.io.Serializable 接口以啓用其序列化功能。
未實現此接口的類將沒法使其任何狀態序列化或反序列化。
可序列化類的全部子類型自己都是可序列化的。由於實現接口也是間接的等同於繼承。
序列化接口沒有方法或字段,僅用於標識可序列化的語義。

關於 serialVersionUID 的描述:
序列化運行時使用一個稱爲 serialVersionUID 的版本號與每一個可序列化類相關聯,該序列號在反序列化過程當中用於驗證序列化對象的發送者和接收者是否爲該對象加載了與序列化兼容的類。若是接收者加載的該對象的類的 serialVersionUID 與對應的發送者的類的版本號不一樣,則反序列化將會致使 InvalidClassException。可序列化類能夠經過聲明名爲 "serialVersionUID" 的字段(該字段必須是靜態 (static)、最終 (final) 的 long 型字段)顯式聲明其本身的 serialVersionUID。

序列化(串行化)特色:
(1)若是某個類可以被串行化,其子類也能夠被串行化。
(2)聲明爲static和transient類型的成員數據不能被串行化。由於static表明類的狀態, transient表明對象的臨時數據;
(3)相關的類和接口:在java.io包中提供的涉及對象的串行化的類與接口有ObjectOutput接口、ObjectOutputStream類、ObjectInput接口、ObjectInputStream類。

  • Object類中常見的方法,爲何wait notify會放在Object裏邊?

toString():輸出一個對象的地址字符串(哈希code碼);能夠經過重寫toString方法,獲取對象的屬性!

equals():比較的是對象的引用是否指向同一塊內存地址, 重寫equals()方法比較兩個對象的內容是否相同

Object() :默認構造方法

clone() :建立並返回此對象的一個副本。

finalize() :當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。

getClass() :返回一個對象的運行時類。

hashCode() :返回該對象的哈希碼值。

notify() :喚醒在此對象監視器上等待的單個線程。

notifyAll() : 喚醒在此對象監視器上等待的全部線程。

wait() : 致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法。

wait(long timeout) : 致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。

wait(long timeout, int nanos) : 致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。

爲何wait notify會放在Object裏邊?wait(),notify(),notifyAll()用來操做線程爲何定義在Object類中?
一、這些方法存在於同步中;
二、使用這些方法必須標識同步所屬的鎖;
三、鎖能夠是任意對象,因此任意對象調用方法必定定義在Object類中。

wait(),sleep()區別:
wait():釋放資源,釋放鎖
sleep():釋放資源,不釋放鎖

  • Java的平臺無關性如何體現出來的

Java從四個方面支持了平臺無關性:
一、最主要的是Java平臺自己(jdk、jre、jvm)。Java平臺扮演Java程序和所在的硬件與操做系統之間的緩衝角色。這樣Java程序只須要與Java平臺打交道,而不用管具體的操做系統。
二、Java語言保證了基本數據類型的值域和行爲都是由語言本身定義的。而C/C++中,基本數據類是由它的佔位寬度決定的,佔位寬度由所在平臺決定的。不一樣平臺編譯同一個C++程序會出現不一樣的行爲。經過保證基本數據類型在全部平臺的一致性,Java語言爲平臺無關性提供強有力的支持。
三、Java class文件。Java程序最終會被編譯成二進制class文件。class文件能夠在任何平臺建立,也能夠被任何平臺的Java虛擬機裝載運行。它的格式有着嚴格的定義,是平臺無關的。
四、可伸縮性。Sun經過改變API的方式獲得三個基礎API集合,表現爲Java平臺不一樣的伸縮性:J2EE,J2SE,J2ME。

  • JDK、JRE和JVM的區別

Java 開發工具包 (JDK)
Java開發工具包是Java環境的核心組件,並提供編譯、調試和運行一個Java程序所需的全部工具,可執行文件和二進制文件。JDK是一個平臺特定的軟件,有針對Windows,Mac和Unix系統的不一樣的安裝包。能夠說JDK是JRE的超集,它包含了JRE的Java編譯器,調試器和核心類。

Java虛擬機(JVM)
JVM是Java編程語言的核心。當咱們運行一個程序時,JVM負責將字節碼轉換爲特定機器代碼。JVM也是平臺特定的,並提供核心的Java方法,例如內存管理、垃圾回收和安全機制等。JVM 是可定製化的,咱們能夠經過Java 選項(java options)定製它,好比配置JVM 內存的上下界。JVM之因此被稱爲虛擬的是由於它提供了一個不依賴於底層操做系統和機器硬件的接口。這種獨立於硬件和操做系統的特性正是Java程序能夠一次編寫多處執行的緣由。

Java運行時環境(JRE)
JRE是JVM的實施實現,它提供了運行Java程序的平臺。JRE包含了JVM、Java二進制文件和其它成功執行程序的類文件。JRE不包含任何像Java編譯器、調試器之類的開發工具。若是你只是想要執行Java程序,你只需安裝JRE便可,沒有安裝JDK的必要。

JDK, JRE 和JVM的區別:
JDK是用於開發的而JRE是用於運行Java程序的。
JDK和JRE都包含了JVM,從而使得咱們能夠運行Java程序。
JVM是Java編程語言的核心而且具備平臺獨立性。

  • Java 8有哪些新特性

一、Lambda 表達式 − Lambda容許把函數做爲一個方法的參數(函數做爲參數傳遞進方法中。 二、方法引用 − 方法引用提供了很是有用的語法,能夠直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可使語言的構造更緊湊簡潔,減小冗餘代碼。 三、默認方法 − 默認方法就是一個在接口裏面有了一個實現的方法。 四、新工具 − 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。 五、Stream API −新添加的Stream API(java.util.stream) 把真正的函數式編程風格引入到Java中。 六、Date Time API − 增強對日期與時間的處理。 七、Optional 類 − Optional 類已經成爲 Java 8 類庫的一部分,用來解決空指針異常。

相關文章
相關標籤/搜索