Jdk1.7 與 jdk1.8的區別,最新的特徵有哪些(美團,360,京東面試題目)

Jdk1.7 與 jdk1.8的區別,最新的特徵有哪些(美團,360,京東面試題目)

在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的新特性:

 
 2.1 接口的默認和靜態方法:

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表達式詳解

函數式接口和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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章