1. 程式人生 > 實用技巧 >JAVA 語法糖 Syntactic surgar

JAVA 語法糖 Syntactic surgar

1)語法糖Syntactic Sugar 糖衣語法,方便開發人員使用,JVM並不識別,會在編譯階段解語法糖,還原為基礎語法。
2)com.sun.tools.javac.main.JavaCompiler中的deSugar方法,負責解語法糖的實現。
3)常見的語法糖有泛型、變長引數、條件編譯、自動拆裝箱、內部類等。
1:switch從1.7支援String和enum型別。
首先對編譯器,switch關鍵字只能使用整型,如byte、char、short、int等。
字串的switch是通過equals()和hashCode()方法來實現的。 2)泛型。
jvm中沒有泛型,只有普通型別和普通方法,泛型類的型別引數,在編譯時都會被擦除。泛型並沒有自己獨特的Class型別。

型別擦除:如果泛型引數指定了上限,如<T extends Comparable>,移除所有型別引數,替換為頂級的父型別,如果沒指定則使用Object。
3)自動裝箱、拆箱
裝箱使用包裝器的valueOf方法,拆箱使用包裝器的xxxValue方法。
byte、short、char、int、long、float、double、boolean => Byte、Short、Character、Integer、Long、Fload、Double、Boolean等。
int i = 10;
Integer n = i;自動裝箱,反編譯class後,Integer.valueof(i)

int j = n;自動拆箱,反編譯class後,使用n.intValue()方法
Integer -128 ~127之間有快取。 4)可變引數
String... strs,反編譯後String[] strs,呼叫時建立String[]陣列,傳入方法。 5)列舉型別
enum 建立具名值的有限集合。
建立一個enum型別,底層public class MyEnum extend Enum
6)內部類
編譯時的概念,編譯後生成兩個不同的.class檔案。Outer.class和Outer$Inner.class 7)數值字面量
整數、浮點數,都允許在數字之間插入任意多個下劃線。編譯階段會去掉。 主要是為了方便閱讀
8)for-each
for-each底層使用普通的for迴圈和迭代器 陣列的for each 相當於普通的for迴圈 List的 for each 相當於iterator迭代

for(Iterator it =testStr.iterator();it.hasNext();) { xxxxxxxxx}

9)lambda表示式
lambda的實現,依賴了底層lambda的api。編譯階段糖解,將lambda表示式轉換為呼叫內部api的方式。LambdaMetafactory#metafactory

10)Iterator 在工作的時候是不允許被迭代的物件被改變的。會丟擲ConcurrentModificationException異常,可以使用Iterator本身的remove方法。

11: 將IO 流放入try()中,可以省略最後關閉流的動作.無需再在 finally{}中新增 close方法塊

try (BufferedInputStream br=new BufferedInputStream(new FileInputStream(new File("src/main/java/ScheduledTimeTask.java")));){

} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}

12:—般情況下,程式中的每一行程式碼都要參加編譯。但有時候出於對程式程式碼優化的考慮,希望只對其中一部分內容進行編譯,此時就需要在程式中加上條件,讓編譯器只對滿足條件的程式碼進行編譯,將不滿足條件的程式碼捨棄,這就是條件編譯。

13:斷言

assert a == b;
System.out.println("公眾號:Hollis");
assert a != b : "xx";//assert後面跟個冒號表示式。如果冒煙前為true,則冒號後面的被忽略,否則丟擲AssertionError,錯誤內容為冒號後面的內容。

14:泛型擦除帶來的問題

首先,泛型不能認定為過載

其次,泛型的型別引數不能用在Java異常處理的catch語句中。因為異常處理是由JVM在執行時刻來進行的。由於型別資訊被擦除,JVM是無法區分兩個異常型別MyException<String>和MyException<Integer>的