1. 程式人生 > >Java中有哪些語法糖?

Java中有哪些語法糖?


不要你寫彙編,Java句句是糖

不能同意上面的這句話,要說為什麼,首先要定義下面要講的“語法糖”。

語法糖指計算機語言中新增的某種語法,這種語法對語言的功能並沒有影響,並沒有給語言新增什麼新東西,但是更方便程式設計師使用。通常來說使用語法糖能夠增加程式的可讀性,從而減少程式程式碼出錯的機會。
語法糖_百度百科

從上面可以看出,就Java語言而言,語法糖並沒有給class級別的程式碼新增其他特性,而是藉助編譯器,實現了基於編譯器的新語法。這種新語法方便易用,可讀性好易維護,所以稱之為“糖”。下面談到的都是基於編譯器的語法糖。

 

1. 自動裝箱與拆箱(Autoboxing and unboxing)(JDK 1.5)

程式碼

Integer amount = 100; 

編譯後,就自動裝箱為

Integer amount = Integer.valueOf(100); 

同樣的,自動拆箱

Integer amount = ...;
int x = amount; // 實際為: int x = amount.intValue(); 

可以看出,自動拆箱是有可能丟擲NullPointerException的,要留意避免。

 

2. 泛型與型別擦除(JDK 1.5)

從JDK 1.5開始,Java引入了泛型,但Java的泛型是通過型別擦除實現的(當然有很多人吐槽這不是真正的泛型),即只在原始碼中有泛型定義,到了class級別就被擦除了(類的成員變數的泛型可以通過反射獲取到)。

Map<String,String> map = new HashMap<String,String>(); map.put("hello world","你好啊,李銀河"); String hello = map.get("hello"); System.out.println(hello); // 編譯後,反省被擦除,並引入強制型別轉換 Map map = new HashMap(); //型別擦除 map.put("hello", "你好啊,李銀河"); String hello = (String)map.get("hello");//強制轉換 System.out.println(hello); 

 

3. 方法變長引數(JDK 1.5)

public static void print(String... args) { for(String str : args){ System.out.println(str); } } // 編譯後 public static void print(String... args) { String[] var1 = args; int var2 = args.length; //增強for迴圈的陣列實現方式 for(int var3 = 0; var3 < var2; ++var3) { String str = var1[var3]; System.out.println(str); } } 

 

4. 介面Iterable支援的foreach語法(JDK 1.5)

很常見,不贅述

 

5. 列舉型別

 

6. 介面AutoCloseable支援的try-with-resource語法(JDK 1.7)

 

7. switch支援列舉、字串

 

其他:

JDK1.8 待熟悉了Lambda的本質之後再決定補充與否。

 

作者:陳鵬
連結:https://www.zhihu.com/question/26971230/answer/268464546