天天看點

【彙總】Java 7, 8 ,9 , 10的新增特性Java 7的那些文法糖Java8新特性詳解Java9新特性Java10

Java 7的那些文法糖

http://blog.csdn.net/chenleixing/article/details/47802653

1.switch可以接受string類型而不像以前僅僅是int;

2.異常catch可以一次處理完而不像以前一層層的surround;

3.泛型類執行個體化也不用繁瑣的将泛型聲明再寫一遍;

4.檔案讀寫 會自動關閉流而不像以前那樣需要在finally中顯式close;

5.數值可以使用下劃線分隔;

6.檔案讀寫功能增強,有更簡單的api調用;(Path path = Paths.get(“c:\Temp\temp”); Files.deleteIfExists(path); )

7.檔案改變的事件通知功能;(watchService = FileSystems.getDefault().newWatchService())

8.多核 并行計算的支援加強 fork join 架構;(

ForkJoinPool pool = new ForkJoinPool(numberOfProcessors);

)

9.還有一些動态特性的加入。(

java.lang.invoke 包的引入。 MethodHandle, CallSite 還有一些其他類供使用。

)

Java8新特性詳解

本段小結摘自這裡:

http://blog.csdn.net/cdw8131197/article/details/68553148

但這篇總結更精彩和深入:

java8新特性詳解

1.接口的預設方法,在接口中新增了default方法和static方法,這兩種方法可以有方法體;接口裡的靜态方法,即static修飾的有方法體的方法不會被繼承或者實作,但是靜态變量會被繼承。

結論:接口中的static方法不能被繼承,也不能被實作類調用,隻能被自身調用

。default方法可以被子接口繼承亦可被其實作類所調用;default方法被繼承時,可以被子接口覆寫

2.

Lambda表達式

可以看成是匿名内部類,使用Lambda表達式時,接口必須是函數式接口;

基本文法:

<函數式接口>  <變量名> = (參數,參數..) -> {
                    //方法體
        }
說明: 
(參數,參數…)表示參數清單;->表示連接配接符;{}内部是方法體 
、=右邊的類型會根據左邊的函數式接口類型自動推斷; 
、如果形參清單為空,隻需保留(); 
、如果形參隻有個,()可以省略,隻需要參數的名稱即可; 
、如果執行語句隻有句,且無傳回值,{}可以省略,若有傳回值,則若想省去{},則必須同時省略return,且執行語句也保證隻有句; 
、形參清單的資料類型會自動推斷; 
、lambda不會生成一個單獨的内部類檔案; 
、lambda表達式若通路了局部變量,則局部變量必須是final的,若是局部變量沒有加final關鍵字,系統會自動添加,此後在修改該局部變量,會報錯;
           
3.如果一個接口隻有一個抽象方法,則該接口稱之為

函數式接口

,因為 預設方法 不算抽象方法,是以你也可以給你的函數式接口添加預設方法。

函數式接口可以使用Lambda表達式,lambda表達式會被比對到這個抽象方法上 ;

我們可以将lambda表達式當作任意隻包含一個抽象方法的接口類型,確定你的接口一定達到這個要求,你隻需要給你的接口添加

@FunctionalInterface

注解,編譯器如果發現你标注了這個注解的接口有多于一個抽象方法的時候會報錯的

5.作用域:在lambda表達式中通路外層作用域和老版本的匿名對象中的方式很相似。你可以直接通路标記了final的外層局部變量,或者執行個體的字段以及靜态變量。

6.我們可以直接在lambda表達式中通路外層的局部變量,但是該局部變量必須是final的,即使沒有加final關鍵字,之後我們無論在哪(lambda表達式内部或外部)修改該變量,均報錯。

7.通路對象字段與靜态變量,lambda内部對于執行個體的字段以及靜态變量是即可讀又可寫。該行為和匿名對象是一緻的;

8.通路接口的預設方法:Predicate接口,Function接口,Supplier接口,Consumer 接口,Comparator 接口,Optional 接口。

Stream 接口

重要!!!建立stream–通過of方法, 通過generator方法。

9.Date API: Java 8 在包java.time下包含了一組全新的時間日期API。Clock時鐘,Timezones時區,LocalTime本地時間,LocalDate本地日期,LocalDateTime 本地日期時間 。DayOfWeek… 隻要附加上時區資訊,就可以将其轉換為一個時間點Instant對象,Instant時間點對象可以很容易的轉換為老式的java.util.Date。

10.Annotation 注解

在Java 8中支援多重注解了

Lambda表達式其他特性:

1、引用執行個體方法

<函數式接口>  <變量名> = <執行個體>::<執行個體方法名>
    //調用
    <變量名>.接口方法([實際參數...])
           

2、引用類方法

<函數式接口>  <變量名> = <類>::<類方法名稱>
    //調用
    <變量名>.接口方法([實際參數...])
           

3、引用類的執行個體方法

//定義接口
    interface <函數式接口>{
        <傳回值> <方法名>(<類><類名稱>,[其他參數...]); 
    }
    <函數式接口>  <變量名> = <類>::<類執行個體方法名>
    //調用
    <變量名>.接口方法(類的執行個體,[實際參數...])
           

4、引用構造器方法

<函數式接口>  <變量名> = <類>::<new>
    //調用
    <變量名>.接口方法([實際參數...])
           

java.util.Function包下都是函數式接口,我們可以直接拿來使用:

Java9新特性

http://developer.51cto.com/art/201801/564443.htm

modularity System 子產品系統

Java 9中主要的變化是已經實作的子產品化系統。

Modularity提供了類似于OSGI架構的功能,子產品之間存在互相的依賴關系,可以導出一個公共的API,并且隐藏實作的細節,Java提供該功能的主要的動機在于,減少記憶體的開銷,在JVM啟動的時候,至少會有30~60MB的記憶體加載,主要原因是JVM需要加載rt.jar,不管其中的類是否被classloader加載,第一步整個jar都會被JVM加載到記憶體當中去,子產品化可以根據子產品的需要加載程式運作需要的class。

在引入了子產品系統之後,JDK 被重新組織成 94 個子產品。Java 應用可以通過新增的 jlink 工具,建立出隻包含所依賴的 JDK 子產品的自定義運作時鏡像。這樣可以極大的減少 Java 運作時環境的大小。使得JDK可以在更小的裝置中使用。采用子產品化系統的應用程式隻需要這些應用程式所需的那部分JDK子產品,而非是整個JDK架構了。

HTTP/2

JDK9之前提供HttpURLConnection API來實作Http通路功能,但是這個類基本很少使用,一般都會選擇Apache的Http Client,此次在Java 9的版本中引入了一個新的package:java.net.http,裡面提供了對Http通路很好的支援,不僅支援Http1.1而且還支援HTTP2(什麼是HTTP2?請參見HTTP2的時代來了…),以及WebSocket,據說性能特别好。

【彙總】Java 7, 8 ,9 , 10的新增特性Java 7的那些文法糖Java8新特性詳解Java9新特性Java10

注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器子產品傳遞。也就是說,這套 API 不能保證 100% 完成。

JShell

用過Python的童鞋都知道,Python 中的讀取-求值-列印循環( Read-Evaluation-Print Loop )很友善。它的目的在于以即時結果和回報的形式。

java9引入了jshell這個互動性工具,讓Java也可以像腳本語言一樣來運作,可以從控制台啟動 jshell ,在 jshell 中直接輸入表達式并檢視其執行結果。當需要測試一個方法的運作效果,或是快速的對表達式進行求值時,jshell 都非常實用。

除了表達式之外,還可以建立 Java 類和方法。jshell 也有基本的代碼完成功能。我們在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。

不可變集合工廠方法

Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工廠方法來建立不可變集合。

多版本相容 JAR

當一個新版本的 Java 出現的時候,你的庫使用者要花費很長時間才會切換到這個新的版本。這就意味着庫要去向後相容你想要支援的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實際上意味着未來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本相容 JAR 功能能讓你建立僅在特定版本的 Java 環境中運作庫程式時選擇使用的 class 版本:

【彙總】Java 7, 8 ,9 , 10的新增特性Java 7的那些文法糖Java8新特性詳解Java9新特性Java10

在上述場景中, multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特别為 Java 9 準備的 class 版本,可以運用 Java 9 所提供的特性和庫。同時,在早期的 Java 諸版本中使用這個 JAR 也是能運作的,因為較老版本的 Java 隻會看到頂層的這個 Helper 類。

統一 JVM 日志

Java 9 中 ,JVM 有了統一的日志記錄系統,可以使用新的指令行選項-Xlog 來控制 JVM 上 所有元件的日志記錄。該日志記錄系統可以設定輸出的日志消息的标簽、級别、修飾符和輸出目标等。

Java 9 的垃圾收集機制

Java 9 移除了在 Java 8 中 被廢棄的垃圾回收器配置組合,同時把G1設為預設的垃圾回收器實作。替代了之前預設使用的Parallel GC,對于這個改變,evens的評論是醬紫的:這項變更是很重要的,因為相對于Parallel來說,G1會在應用線程上做更多的事情,而Parallel幾乎沒有在應用線程上做任何事情,它基本上完全依賴GC線程完成所有的記憶體管理。這意味着切換到G1将會為應用線程帶來額外的工作,進而直接影響到應用的性能

I/O 流新特性

java.io.InputStream 中增加了新的方法來讀取和複制 InputStream 中包含的資料。

readAllBytes:讀取 InputStream 中的所有剩餘位元組。

readNBytes: 從 InputStream 中讀取指定數量的位元組到數組中。

transferTo:讀取 InputStream 中的全部位元組并寫入到指定的 OutputStream 中 。

Java10

Java 10的10個新特性,将徹底改變你寫代碼的方式!

1. 局部變量類型推斷

局部變量類型推斷可以說是Java 10中最值得注意的特性,這是Java語言開發人員為了簡化Java應用程式的編寫而采取的又一步,如下圖所示。

【彙總】Java 7, 8 ,9 , 10的新增特性Java 7的那些文法糖Java8新特性詳解Java9新特性Java10

這個新功能将為Java增加一些文法糖 - 簡化它并改善開發者體驗。新的文法将減少與編寫Java相關的冗長度,同時保持對靜态類型安全性的承諾。

局部變量類型推斷将引入"var"關鍵字,也就是你可以随意定義變量而不必指定變量的類型,如:

将被下面這個新文法所取代:

看完是不是有點JS的即視感???越來越像JS了嗎?!雖然類型推斷在Java中不是一個新概念,但在局部變量中确是很大的一個改進。

說到類型推斷,從JDK 5引進泛型,到JDK 7的"<>"操作符允許不綁定類型而初始化List,再到JDK 8的Lambda表達式,再到現在JDK 10的局部變量類型推斷,Java類型推斷正大刀闊斧的向前發展。

局部變量類型推薦僅限于如下使用場景:

局部變量初始化for循環内部索引變量傳統的for循環聲明變量Java官方表示,它不能用于以下幾個地方:

方法參數構造函數參數方法傳回類型字段捕獲表達式(或任何其他類型的變量聲明)

2. GC改進和記憶體管理

JDK 10中有2個JEP專門用于改進目前的垃圾收集元素。

第一個垃圾收集器接口是(JEP 304),它将引入一個純淨的垃圾收集器接口,以幫助改進不同垃圾收集器的源代碼隔離。

預定用于Java 10的第二個JEP是針對G1的并行完全GC(JEP 307),其重點在于通過完全GC并行來改善G1最壞情況的等待時間。G1是Java 9中的預設GC,并且此JEP的目标是使G1平行。

3. 線程本地握手(JEP 312)

JDK 10将引入一種線上程上執行回調的新方法,是以這将會很友善能停止單個線程而不是停止全部線程或者一個都不停。

4. 備用記憶體裝置上的堆配置設定(JEP 316)

允許HotSpot VM在備用記憶體裝置上配置設定Java對象堆記憶體,該記憶體裝置将由使用者指定。

5. 其他Unicode語言 - 标記擴充(JEP 314)

目标是增強java.util.Locale及其相關的API,以便實作語言标記文法的其他Unicode擴充(BCP 47)。

6. 基于Java的實驗性JIT編譯器

Oracle希望将其Java JIT編譯器Graal用作Linux / x64平台上的實驗性JIT編譯器。

7. 根證書(JEP 319)

這個的目标是在Oracle的Java SE中開源根證書。

8. 根證書頒發認證

這将使OpenJDK對開發人員更具吸引力,它還旨在減少OpenJDK和Oracle JDK建構之間的差異。

9. 将JDK生态整合單個存儲庫(JEP 296)

此JEP的主要目标是執行一些記憶體管理,并将JDK生态的衆多存儲庫組合到一個存儲庫中。

10. 删除工具javah(JEP 313)

從JDK中移除了javah工具,這個很簡單并且很重要。

Java 10嘗鮮

就像所有其他JDK版本一樣,Oracle已經釋出了一個Java 10初始候選版本,Java開發者可以下載下傳此版本用來測試新功能。如果你對Java 10抱有期待想提早嘗試,那麼現在就開始吧!

嘗鮮位址:http://openjdk.java.net/projects/jdk/10/

最後的一點想法

對于第一點新特性來說确實是一個大的跨越,其他特性或多或少都能帶給開發者福音。但最終Java 10會是什麼樣,或許還會增加更多實用性的新功能或者優化,我們還得期待!

現在要做的就是,趕緊熟悉JDK 8,現在已經是很多網際網路企業标配了。如果還在使用JDK4-7,那真的是要OUT了。。