语法糖
Syntactic Sugar
在编程语言中添加一种新得语法,这种语法对语言本身得功能没有影响,可以更加方便程序员,代码更简洁。
Java 虚拟机并不支持语法糖,这些语法在编译阶段就会被还原成简单得基础语法结构。
Java 有哪些语法糖:
1 switch 支持 String 和枚举
Java 的 switch 本身只支持简单数据类型 int。其他数据类型都是转换成整型的。例如 byte、short 和 char。
字符串的 switch 是通过 equals 方法和 hashCode()方法实现的。显示通过 hashCode 方法获得哈希值比较,在通过 equals 方法进行安全检查
2 泛型
对于 Java 虚拟机而言,不能识别 Map<String,String>这样的语法,需要在编译阶段类型擦除。虚拟机中没有泛型,只有普通类和普通方法,所有范型类的类型参数在编译时都会被擦除。泛型类并没有自己独有的 Class 类对象。
ArrayList<String> list = new ArrayList<>() String a = list.get(0);
编译之后
ArrayList list = new ArrayList(); String a = (String)list.get(0);
3 装箱和拆箱
装箱,Java 将基本数据类型转换成对应的包装类型。
Integer a = 3;
编译之后
Integer a = Integer.valueOf(3);
拆箱,Java 将包装类类型转换成简单数据类型。
Integer a = new Integer(3); int b = a;
编译之后
Integer a = new Integer(3); int b = a.intValue();
4 可变长参数
可变长参数,编译之后就是一个数组
public static void main(String[] args) { print(1,2,3,4,5); } public static void print(int ... args) { }
编译之后
public static void main(String[] args) { print(new int[]{ 1,2,3,4,5 }); } public static void print(int[] args) { }
5 数字字面量
为了方便阅读,在数字中间添加下划线
int m = 10_000;
编译之后
int m = 10000;
6 枚举
枚举,Java 会创建一个继承自 Enum 的类,自动创建静态最终的对象
public enum Week{ MONDAY,TUSDAY }
反编译代码
public final class Week extends Enum{ private Week(String s,int i){ super(s,i); } ...... public static final Week MONDAY; public static final Week TUSDAY; ..... }
7 内部类
内部类可以理解成外部类的一个普通成员。
某个类如果有内部类,那么在编译的时候,会生成两个 class 文件,外部类一个,内部类的 class 文件的文件名是 外部类名$内部类名.class.
8 断言
抛出 AssertionError 异常
int a = 1; int b = 1; assert a==b;
代码反编译
int a = 1; int b = 1; if(!$assertionDisabled && a!=b){ throw new AssertionError(); }
9 条件编译
判断条件为常量的 if 语句实现,根据 if 判断条件的真假,编译器直接把分支为 else 的代码块消除。
boolean f1 = true; boolean f2 = false; if(f1){ System.out.println("wanmait"); } if(f2){ System.out.println("万码学堂"); }
编译之后
boolean f1 = true; boolean f2 = false; System.out.println("wanmait");
10 lambda
lambda 表达式会生成一个方法,调用该方法
List<String> strList = ImmutableList.of("zhangsan","lisi","wangwu"); strList.forEach(s -> {Sustem.out.println(s)});
编译之后的代码
public static void main(String[] args) { ImmutableList strList = ImmutableList.of((Object)"zhangsan", (Object)"lisi", (Object)"wangwu"); strList.forEach((Consumer<String>)LambdaMetafactory.metafactory(null, null, null, (Ljava/lang/Object;)V, lambda$main$0(java.lang.String ), (Ljava/lang/String;)V)()); } //lambda生成的方法 private static void lambda$main$0(String s) { System.out.println(s); }
11 for-each 循环
public static void main(String[] args) { List<String> strList = ImmutableList.of("zhangsan", "lisi", "wangwu"); for (String s : strList) { System.out.println(s); } }
编译后代码为
public static transient void main(String args[]) { List strList = ImmutableList.of("zhangsan", "lisi", "wangwu"); String s; for(Iterator iterator = strList.iterator(); iterator.hasNext(); System.out.println(s)) s = (String)iterator.next(); }
12 try-with-resource
public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("file"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { // handle exception } }
自动关闭 BufferedReader 流。
0条评论
点击登录参与评论