指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
并且该语法糖只存在编译期。
解语法糖
java虚拟机并不支持所谓的语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构。这个过程就叫做解语法糖。
基本语法糖块
1.switch支持String与枚举
其实对于编译器来说switch中其实只能使用整型。
而对于String类型的支持,是通过equals和hashcode的方法来进行实现的。先比较哈希值,再通过equals方法进行比较。
编译前:
反编译后:
枚举
2.泛型和类型擦除
虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除。
例如:
java虚拟机根本不认识Map<String, String> map这样的语法,将其解语法糖之后就会变成Map map = new HashMap();
3.自动装箱与拆箱
java自动将原始类型值转换成对应的对象,该过程叫做装箱,反之叫做拆箱。
装箱的时候自动调用的是Integer的valueof方法,在拆箱的时候自动调用的是Integer的intvalue方法
public class Candy{
public static void main(String[] args){
Integer x = 1;
int y = x;
}
}
//反编译后的结果
public class Candy{
public static void main(String[] args){
Integer x = Integer.valueOf(1);
int y = x.intValue();
}
}
4.方法变长参数
允许一个方法把任意数量的值作为参数
public static void main(String[] args) {
print("aaaaa", "bbbbb", "ccccc");
}
public static void print(String... strs) {
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
反编译之后
public static void main(String[] args) {
print(new String[]{"aaaaa", "bbbbb", "ccccc"});
}
public static void print(String[] strs) {
for (int i = 0; i < strs.length; i++)
System.out.println(strs[i]);
}
将其反编译后的代码可以看到,可变参数在被使用的时候,java虚拟机首先会创建一个数组,数组的长度就是调用该方法时传递实参的个数,然后再把参数值全部放到这个数组当中,再把这个数组作为参数传递到被调用的方法中。
5.枚举
关键字enum可以将具有名和值的有限集合创建成为一个新的类型,这个集合可以被程序使用。
enum是一个关键字,并不是一个类
当我摩恩使用enum来定一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承enum类,所以枚举类型不能被继承。
6.内部类
在一个类里面定义一个其他的类,一旦编译成功就会生成两个完全不同的.class文件,分别是outer.class和outer$inner.class文件。
7.条件编译
在一般情况下,程序中的每一行代码都要参加编译。但是有的时候对于优化的考虑,只对代码内容中的一部分进行编译。典型的例子就是ifelse语句
如果if后为真则只编译if内的语句,反之则编译else中的语句
8.断言
其实断言的底层实现就是if语言,如果断言结果为true,则什么都不做,程序继续执行,如果断言结果为false,则程序抛出AssertError来打断程序的执行
9.数值字面量
不管是证书还是浮点数,都允许在数字之间插入任意多个下划线。不会影响数字字面的数值主要是为了方便阅读。在反编译的阶段,会将下划线删除。
10.增强for循环
实现的原理就是使用了普通的for循环和迭代器
public class Candy{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
for(int e:arr){
System.out.println(e);
}
}
}
//反编译后的结果
public class Candy{
public static void main(String[] args){
int[] arr = new int[]{1,2,3,4,5};
for(int i=0;i<arr.length;i++){
int e = arr[i];
System.out.println(e);
}
}
}
public class Candy{
public static void main(String[] args){
List<Integer> list = Arrays.asList(1,2,3,4,5);
for(int i:list){
System.out.println(i);
}
}
//反编译后的结果
public class Candy{
public static void main(String[] args){
List<Integer> list = Arrays.asList(1,2,3,4,5);
Iterator iter = list.iterator();
while(iter.hasNext()){
Integer e= (Integer)iter.next;
System.out.println(e);
}
}
}
11.try-with-resource语句
public static void main(String args[]) {
try (BufferedReader br = new BufferedReader(new FileReader("d:\\ hello.xml"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// handle exception
}
}
简化的关闭文件
12.Lambda表达式