语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

之所以叫「语法」糖,不只是因为加糖后的代码功能与加糖前保持一致,更重要的是,糖在不改变其所在位置的语法结构的前提下,实现了运行时的等价。可以简单理解为,加糖后的代码编译后跟加糖前一模一样。

之所以叫语法「糖」,是因为加糖后的代码写起来很爽,包括但不限于:代码更简洁流畅,代码更语义自然…写着爽,看着爽,就像吃了糖。效率高,错误少…

据说还有一种叫做「语法盐」的东西,主要目的是通过反人类的语法,让你更痛苦的写代码。其实它同样能达到避免代码书写错误的效果,但编程效率应该是降低了,毕竟提高了语法学习门槛,让人咸到忧伤…

最基本的,for循环就是一个语法糖:

for(int i = 0; i < 5; i ++){
}

而实际上跟while没啥区别:

int i = 0;
while ( i <5 ){
    ...
    i ++;
}

Python中也有非常多的语法糖,比如:

i = a if a < b else b

这与下面的代码是同样的效果

if a < b:
    i = a
else
    i = b

在Java中有很多语法糖的特性,比如泛型、主动装箱拆箱、条件编译等诸多语法。

具体实现

1)switch从1.7支持String和enum类型。
首先对编译器,switch关键字只能使用整型,如byte、char、short、int等。字符串的switch是通过equals()和hashCode()方法来实现的。

什么是Java的语法糖(syntactic suger)插图

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循环和迭代器

什么是Java的语法糖(syntactic suger)插图1

9)lambda表达式
lambda的实现,依赖了底层lambda的api。编译阶段糖解,将lambda表达式转换为调用内部api的方式。LambdaMetafactory#metafactory

3,注意点

1)Iterator 在工作的时候是不允许被迭代的对象被改变的。会抛出ConcurrentModificationException异常,可以使用Iterator本身的remove方法。
2)ListItr与Ltr操作expectedModCount避免异常。
使用int cursor;下标索引

什么是Java的语法糖(syntactic suger)插图2

int nextIndex;和Node<E> next;下标

什么是Java的语法糖(syntactic suger)插图3

参考文章:https://www.jianshu.com/p/536bcceb99dc

https://www.jianshu.com/p/777b10385524



什么是Java的语法糖(syntactic suger)插图4

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2020/08/26/syntactic-suger/