什么是语法糖
所谓的 语法糖 ,其实就是指 java 编译器把 .java 源码编译为 .class 字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利
注意,以下代码的分析,借助了 javap 工具,idea 的反编译功能,idea 插件 jclasslib 等工具。另外, 编译器转换的结果直接就是 class 字节码,只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并不是编译器还会转换出中间的 java 源码,切记。
1.默认构造器
2.自动装箱&自动拆箱
3.泛型擦除(重点)
- 泛型擦除的作用和好处如下:
- 兼容性:泛型擦除使得使用泛型的代码可以与旧的非泛型代码兼容。在泛型引入之前的代码可以继续使用,并且可以与新的泛型代码进行互操作。
- 运行效率:由于泛型擦除减少了运行时的类型检查和类型转换,因此可以提高代码的运行效率。在擦除后,泛型对象被当作它们的原始类型来处理,避免了额外的类型检查和转换操作。
- 减少代码冗余:泛型擦除减少了重复代码的编写。在擦除后,不同的泛型类型会被擦除为相同的原始类型,从而减少了需要编写类似代码的情况。这样可以避免代码冗余和维护成本的增加。
- 可读性和简洁性:通过使用泛型,代码可以更加可读和简洁。泛型提供了类型安全,并使得代码更易于理解。擦除后,代码中的类型参数被替换为原始类型,从而使代码更加清晰和简洁。
尽管泛型擦除带来了一些限制和局限性(例如无法在运行时完全获得泛型类型信息),但它为我们提供了一种强大的工具来编写更安全、可复用和高效的代码。在大多数情况下,泛型擦除的好处远远超过了它的限制,并为Java带来了更好的语言特性。
4.可变参数
5.foreach循环
-
数组的foreach循环
-
集合的foreach循环
6.switch 字符串
在编译器中执行的操作 :
public class Candy6 {
public Candy6() {
}
public static void main(String[] args) {
String str = "hello";
int x = -1;
// 通过字符串的 hashCode + value 来判断是否匹配
switch (str.hashCode()) {
// hello 的 hashCode
case 99162322 :
// 再次比较,因为字符串的 hashCode 有可能相等
if(str.equals("hello")) {
x = 0;
}
break;
// world 的 hashCode
case 11331880 :
if(str.equals("world")) {
x = 1;
}
break;
default:
break;
}
// 用第二个 switch 在进行输出判断
switch (x) {
case 0:
System.out.println("h");
break;
case 1:
System.out.println("w");
break;
default:
break;
}
}
}
过程说明:
- 在编译期间,单个的 switch 被分为了两个
- 第一个用来匹配字符串,并给 x 赋值
- 字符串的匹配用到了字符串的 hashCode ,还用到了 equals 方法
- 使用 hashCode 是为了提高比较效率,使用 equals 是防止有 hashCode 冲突(如 BM 和 C .)
- 第二个用来根据x的值来决定输出语句