1. 程式人生 > >java 1.7 1.8新特性

java 1.7 1.8新特性

val row def jce arr app 線程安全 動態 adl

在JDK1.7的新特性方面主要有下面幾方面的增強:
1.jdk7語法上
1.1二進制變量的表示,支持將整數類型用二進制來表示,用0b開頭。
1.2 Switch語句支持string類型
1.3 Try-with-resource語句
註意:實現java.lang.AutoCloseable接口的資源都可以放到try中,跟final裏面的關閉資源類似; 按照聲明逆序關閉資源 ;Try塊拋出的異常通過Throwable.getSuppressed獲取
1.4 Catch多個異常 說明:Catch異常類型為final; 生成Bytecode 會比多個catch小; Rethrow時保持異常類型
1.5 數字類型的下劃線表示 更友好的表示方式,不過要註意下劃線添加的一些標準
1.6 泛型實例的創建可以通過類型推斷來簡化 可以去掉後面new部分的泛型類型,只用<>就可以了
1.7在可變參數方法中傳遞非具體化參數,改進編譯警告和錯誤
1.8 信息更豐富的回溯追蹤 就是上面try中try語句和裏面的語句同時拋出異常時,異常棧的信息
2. NIO2的一些新特性
1.java.nio.file 和java.nio.file.attribute包 支持更詳細屬性,比如權限,所有者
2. symbolic and hard links支持
3. Path訪問文件系統,Files支持各種文件操作
4.高效的訪問metadata信息
5.遞歸查找文件樹,文件擴展搜索
6.文件系統修改通知機制
7.File類操作API兼容
8.文件隨機訪問增強 mapping a region,locl a region,絕對位置讀取
9. AIO Reactor(基於事件)和Proactor
2.1IO and New IO 監聽文件系統變化通知
通過FileSystems.getDefault().newWatchService()獲取watchService,然後將需要監聽的path目錄註冊到這個watchservice中,對於這個目錄的文件修改,新增,刪除等實踐可以配置,然後就自動能監聽到響應的事件。
2.2 IO and New IO遍歷文件樹 ,通過繼承SimpleFileVisitor類,實現事件遍歷目錄樹的操作,然後通過Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);這個API來遍歷目錄樹
2.3 AIO異步IO 文件和網絡 異步IO在java
NIO2實現了,都是用AsynchronousFileChannel,AsynchronousSocketChanne等實現,關於同步阻塞IO,同步非阻塞IO,異步阻塞IO和異步非阻塞IO。Java NIO2中就實現了操作系統的異步非阻塞IO。
3. JDBC 4.1
3.1.可以使用try-with-resources自動關閉Connection, ResultSet, 和 Statement資源對象
3.2. RowSet 1.1:引入RowSetFactory接口和RowSetProvider類,可以創建JDBC driver支持的各種 row sets,這裏的rowset實現其實就是將sql語句上的一些操作轉為方法的操作,封裝了一些功能。
3.3. JDBC-ODBC驅動會在jdk8中刪除
4. 並發工具增強
4.1.fork-join
最大的增強,充分利用多核特性,將大問題分解成各個子問題,由多個cpu可以同時解決多個子問題,最後合並結果,繼承RecursiveTask,實現compute方法,然後調用fork計算,最後用join合並結果。
4.2.ThreadLocalRandon 並發下隨機數生成類,保證並發下的隨機數生成的線程安全,實際上就是使用threadlocal
4.3. phaser 類似cyclebarrier和countdownlatch,不過可以動態添加資源減少資源
5. Networking增強

新增URLClassLoader close方法,可以及時關閉資源,後續重新加載class文件時不會導致資源被占用或者無法釋放問題
URLClassLoader.newInstance(new URL[]{}).close();
新增Sockets Direct Protocol
繞過操作系統的數據拷貝,將數據從一臺機器的內存數據通過網絡直接傳輸到另外一臺機器的內存中
6. Multithreaded Custom Class Loaders
解決並發下加載class可能導致的死鎖問題,這個是jdk1.6的一些新版本就解決了,jdk7也做了一些優化。有興趣可以仔細從官方文檔詳細了解

JDK1.8的新特性
一、接口的默認方法
Java 8允許我們給接口添加一個非抽象的方法實現,只需要使用 default關鍵字即可,這個特征又叫做擴展方法。
二、Lambda 表達式
在Java 8 中你就沒必要使用這種傳統的匿名對象的方式了,Java 8提供了更簡潔的語法,lambda表達式:
Collections.sort(names, (String a, String b) -> {

return b.compareTo(a);

});
三、函數式接口
Lambda表達式是如何在java的類型系統中表示的呢?每一個lambda表達式都對應一個類型,通常是接口類型。而“函數式接口”是指僅僅只包含一個抽象方法的接口,每一個該類型的lambda表達式都會被匹配到這個抽象方法。因為 默認方法 不算抽象方法,所以你也可以給你的函數式接口添加默認方法。
四、方法與構造函數引用
Java 8 允許你使用 :: 關鍵字來傳遞方法或者構造函數引用,上面的代碼展示了如何引用一個靜態方法,我們也可以引用一個對象的方法:
converter = something::startsWith;

String converted = converter.convert("Java");

System.out.println(converted);
五、Lambda 作用域
在lambda表達式中訪問外層作用域和老版本的匿名對象中的方式很相似。你可以直接訪問標記了final的外層局部變量,或者實例的字段以及靜態變量。
六、訪問局部變量
可以直接在lambda表達式中訪問外層的局部變量:
七、訪問對象字段與靜態變量
和本地變量不同的是,lambda內部對於實例的字段以及靜態變量是即可讀又可寫。該行為和匿名對象是一致的:
八、訪問接口的默認方法
JDK 1.8 API包含了很多內建的函數式接口,在老Java中常用到的比如Comparator或者Runnable接口,[email protected]
/* */lambda上。
Java 8 API同樣還提供了很多全新的函數式接口來讓工作更加方便,有一些接口是來自Google Guava庫裏的,即便你對這些很熟悉了,還是有必要看看這些是如何擴展到lambda上使用的。

java 1.7 1.8新特性