语法糖简介
语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。
很多人说Java是一个“低糖语言”,其实从Java 7开始Java语言层面上一直在添加各种糖,主要是在“Project Coin”项目下研发。尽管现在Java有人还是认为现在的Java是低糖,未来还会持续向着“高糖”的方向发展。
语法糖介绍
可能对于第一次听说语法糖的人来说,百度出来的简介并不能让你有一个比较清晰的认知,只知道是一种语法,并且是方便程序员的使用。那我换一种说法,Switch语句相信大家都有认知,类型泛型擦除也有一定的了解,那么为什么Java语言能做到呢?这就是语法糖的实现了。
糖块介绍
-
switch支持String与枚举
-
泛型和类型擦除
-
自动装箱与拆箱
-
方法变长参数
-
枚举
-
内部类
-
条件编译
-
断言
-
数值字面量
-
增强for循环
-
try-with-resource语句
-
Lambda表达式
以上是Java中常用的12种语法糖,如果对Java基础有一定的了解,其中的大部分语法糖都会有所了解。这里就不一一赘述,简单选几个进行介绍。
switch支持String与枚举
Java从1.7开始,switch语句就开始支持String类型枚举了。众所周知,switch语句支持int,char等基本数据类型,而从1.7开始同时也支持String类型,那么String类型枚举到底是怎么实现的呢,让我们看一段代码。
//.java文件
public class Test {
public static void main(String[] args) {
String str = "KEKE";
switch (str) {
case "KEKET":
System.out.println(str);
break;
case "KEKE":
System.out.println(str);
break;
default:
break;
}
}
}
//编译后的字节码文件
public class Test {
public Test() {
}
public static void main(String[] args) {
String str = "KEKE";
byte var3 = -1;
switch(str.hashCode()) {
case 2303028:
if (str.equals("KEKE")) {
var3 = 1;
}
break;
case 71393952:
if (str.equals("KEKET")) {
var3 = 0;
}
}
switch(var3) {
case 0:
System.out.println(str);
break;
case 1:
System.out.println(str);
}
}
}
很显然,对于String类型,编译后结合了hashcode和equals方法实现,先通过hashcode筛选,再用equals检查哈希碰撞,最后赋值给var3用另一个switch语句实现逻辑。
增强for循环
增强for循环相信大家也经常用,那么增强for循环是怎么实现的呢,同样让我们看一段代码。
import java.util.Arrays;
import java.util.List;
//.java文件
public class Test {
public static void main(String[] args) {
String[] str = {"KEKE","JAVA","LUCKLY"};
for (String s : str) {
System.out.println(s);
}
List<String> list = Arrays.asList(str);
for (String s : list) {
System.out.println(s);
}
}
}
//编译后的字节码文件
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Test {
public Test() {
}
public static void main(String[] args) {
String[] str = new String[]{"KEKE", "JAVA", "LUCKLY"};
String[] var2 = str;
int var3 = str.length;
for(int var4 = 0; var4 < var3; ++var4) {
String s = var2[var4];
System.out.println(s);
}
List<String> list = Arrays.asList(str);
Iterator var7 = list.iterator();
while(var7.hasNext()) {
String s = (String)var7.next();
System.out.println(s);
}
}
}
可以看到,代码比较简单。用增强for循环遍历数组的时候在反编译后同样是解析为一个for循环;而遍历集合的时候,是引用了迭代器去遍历实现。
总结
其他的语法糖其实也大差不差,没有比较难得代码,如果想要了解什么就写一段test看看字节码文件,相信你就有个大致的了解了。另外,JAVA8的新特性,比如Lambda表达式,StreamAPI等等同样属于语法糖的范畴。通过这些大概的介绍,相信再去看语法糖简介的时候就有所想法了。