在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的新特性
1、接口的默認方法
Java 8容許咱們給接口添加一個非抽象的方法實現,只須要使用 default關鍵字便可,這個特徵又叫作擴展方法。
2、Lambda 表達式
在Java 8 中你就不必使用這種傳統的匿名對象的方式了,Java 8提供了更簡潔的語法,lambda表達式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
3、函數式接口
Lambda表達式是如何在java的類型系統中表示的呢?每個lambda表達式都對應一個類型,一般是接口類型。而「函數式接口」是指僅僅只包含一個抽象方法的接口,每個該類型的lambda表達式都會被匹配到這個抽象方法。由於 默認方法 不算抽象方法,因此你也能夠給你的函數式接口添加默認方法。
4、方法與構造函數引用
Java 8 容許你使用 :: 關鍵字來傳遞方法或者構造函數引用,上面的代碼展現瞭如何引用一個靜態方法,咱們也能夠引用一個對象的方法:
converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);
5、Lambda 做用域
在lambda表達式中訪問外層做用域和老版本的匿名對象中的方式很類似。你能夠直接訪問標記了final的外層局部變量,或者實例的字段以及靜態變量。
6、訪問局部變量
能夠直接在lambda表達式中訪問外層的局部變量:
7、訪問對象字段與靜態變量
和本地變量不一樣的是,lambda內部對於實例的字段以及靜態變量是便可讀又可寫。該行爲和匿名對象是一致的:8、訪問接口的默認方法JDK 1.8 API包含了不少內建的函數式接口,在老Java中經常使用到的好比Comparator或者Runnable接口,這些接口都增長了@FunctionalInterface註解以便能用在lambda上。Java 8 API一樣還提供了不少全新的函數式接口來讓工做更加方便,有一些接口是來自Google Guava庫裏的,即使你對這些很熟悉了,仍是有必要看看這些是如何擴展到lambda上使用的。