在jdk7的新特性方面主要有下面幾方面的增強:
1.1二進制變量的表示,支持將整數類型用二進制來表示,用0b開頭。
所有整數int、short、long、byte都可以用二進制表示:
byte aByte = (byte) 0b00100001;
1.2 Switch語句支持String類型。
1.3 Try-with-resource語句:
參考博客:try-with-resources語句
try-with-resources語句是一種聲明了一種或多種資源的try語句。資源是指在程序用完了之后必須要關閉的對象。try-with-resources語句保證了每個聲明了的資源在語句結束的時候都會被關閉。任何實現了java.lang.AutoCloseable接口的對象,和實現了java.io.Closeable接口的對象,都可以當做資源使用。
1.4 Catch多個異常:
在Java 7中,catch代碼塊得到了升級,用以在單個catch塊中處理多個異常。如果你要捕獲多個異常並且它們包含相似的代碼,使用這一特性將會減少代碼重復度。下面用一個例子來理解。
catch(IOException | SQLException | Exception ex){ logger.error(ex); throw new MyException(ex.getMessage()); }
1.5 數字類型的下划線表示 更友好的表示方式,不過要注意下划線添加的一些標准。
字面常量數字里加下划線的規則:下划線只能在數字之間,在數字的開始或結束一定不能使用下划線。
public class UsingUnderscoreInNumericLiterals { public static void main(String[] args) { int int_num = 1_00_00_000; System.out.println("int num:" + int_num); long long_num = 1_00_00_000; System.out.println("long num:" + long_num); float float_num = 2.10_001F; System.out.println("float num:" + float_num); double double_num = 2.10_12_001; System.out.println("double num:" + double_num); } }
1.6 泛型實例的創建可以通過類型推斷來簡化 可以去掉后面new部分的泛型類型,只用<>就可以了。
1.7 並發工具增強: fork-join框架最大的增強,充分利用多核特性,將大問題分解成各個子問題,由多個cpu可以同時解決多個子問題,最后合並結果,繼承RecursiveTask,實現compute方法,然后調用fork計算,最后用join合並結果。
參考自己寫的例子:Java7 Fork-Join 框架:任務切分,並行處理
JDK1.8的新特性:

Java 8允許我們給接口添加一個非抽象的方法實現,只需要使用 default關鍵字即可,這個特征又叫做擴展方法。
public interface JDK8Interface { // static修飾符定義靜態方法 static void staticMethod() { System.out.println("接口中的靜態方法"); } // default修飾符定義默認方法 default void defaultMethod() { System.out.println("接口中的默認方法"); } }
2.2 Lambda 表達式:(例如: (x, y) -> { return x + y; } ;λ表達式有三部分組成:參數列表,箭頭(->),以及一個表達式或語句塊。)
參考博客: lambda表達式詳解;
在Java 8 中你就沒必要使用這種傳統的匿名對象的方式了,Java 8提供了更簡潔的語法,lambda表達式:
Collections.sort(names, (String a, String b) -> { return b.compareTo(a); });
2.3 方法與構造函數引用:
Java 8 允許你使用 :: 關鍵字來傳遞方法或者構造函數引用,上面的代碼展示了如何引用一個靜態方法,我們也可以引用一個對象的方法:
converter = something::startsWith; String converted = converter.convert("Java"); System.out.println(converted);
2.4 函數式接口:
所謂的函數式接口,當然首先是一個接口,然后就是在這個接口里面只能有一個抽象方法。
2.5 Annotation 注解:支持多重注解:
很多時候一個注解需要在某一位置多次使用。
@YourAnnotation @YourAnnotation public void test(){ //TODO }
2.6 新的日期時間 API:
Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,可以用來替代
java.util.Date和java.util.Calendar。一般會用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration這些類,對於時間日期的改進還是非常不錯的。
2.7 Base64編碼:
Base64編碼是一種常見的字符編碼,可以用來作為電子郵件或Web Service附件的傳輸編碼。
在Java 8中,Base64編碼成為了Java類庫的標准。Base64類同時還提供了對URL、MIME友好的編碼器與解碼器。
2.8 JavaScript引擎Nashorn:
Nashorn允許在JVM上開發運行JavaScript應用,允許Java與JavaScript相互調用。
2.9 Stream的使用:
Stream API是把真正的函數式編程風格引入到Java中。其實簡單來說可以把Stream理解為MapReduce,當然Google的MapReduce的靈感也是來自函數式編程。她其實是一連串支持連續、並行聚集操作的元素。從語法上看,也很像linux的管道、或者鏈式編程,代碼寫起來簡潔明了,非常酷帥!
2.10 Optional:
Java 8引入Optional類來防止空指針異常,Optional類最先是由Google的Guava項目引入的。Optional類實際上是個容器:它可以保存類型T的值,或者保存null。使用Optional類我們就不用顯式進行空指針檢查了。
2.11 擴展注解的支持:
Java 8擴展了注解的上下文,幾乎可以為任何東西添加注解,包括局部變量、泛型類、父類與接口的實現,連方法的異常也能添加注解。
2.12 並行(parallel)數組:
支持對數組進行並行處理,主要是parallelSort()方法,它可以在多核機器上極大提高數組排序的速度。
2.13 編譯器優化:
Java 8將方法的參數名加入了字節碼中,這樣在運行時通過反射就能獲取到參數名,只需要在編譯時使用-parameters參數。
新的Java1.8對IO做了升級:
關於IO/NIO 新IO的對比,請參考:Java NIO:IO與NIO的區別 -阿里面試題
還對CurrentHashMap做了升級,請參考:ConcurrentHashMap原理分析(1.7與1.8)