Java17 相比Java8 的新特性(持续更新)
一、语法糖特性(部分)
1. record 语法
和enum、abstract 关键字一样声明一个类,功能不同,感觉是用来减少冗余代码量的。相当于自动给你生成全参的构造方法和get方法(只不过没有"get"前缀)
public class Main {
public static void main(String[] args) {
System.out.println(new RecordClass(1, 2, 3));
}
record RecordClass(int x, int y, int z) { }
}
编译后
public class Main {
public Main() {
}
public static void main(String[] args) {
System.out.println(new RecordClass(1, 2, 3));
}
static record RecordClass(int x, int y, int z) {
RecordClass(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int x() {
return this.x;
}
public int y() {
return this.y;
}
public int z() {
return this.z;
}
}
}
注意点:
不能被继承或实现,record修饰的对象,默认都是final型,创建出来感觉就是让你临时使用,不用新建模板类啥的。
正如enum对象类的父类是Enum一样,record对象类的父类是java.lang.Record。
2. 增强Switch
int result = switch (x) {
case 1, 2, 3 -> {
System.out.println(x);
yield 10;
}
case 4 -> 11;
default -> throw new IllegalStateException("Unexpected value: " + x);
};
现在的switch 可以获取结果值,如果是单值或表达式,可以直接返回 如case4,如果有逻辑处理,可以使用yield关键字返回(感觉和return差不多),以上代码和下面的结果一样
switch (x) {
case 1, 2, 3:
return 10;
case 4:
return 11;
default:
throw new IllegalStateException("Unexpected value: " + x);
}
具体那种写法,示人而异,不过第二种写法idea 编译器会提示改为上面的。
3. 增强Instanceof
//java 8 需要先判断 然后转换,然后使用
if (object instanceof RecordClass) {
RecordClass obj = (RecordClass) object;
//obj.xx
}
//java 16 新特性,可以直接转换后给obj 直接使用
if (object instanceof RecordClass obj) {
//obj.xx
}
4. 增强TextBlocks
//对于JSON格式只能使用转义字符,难看且不能复制他用
String jsonStr = "{\"x\":1}";
//使用"""语法直接在中间填充即可
String json = """
{
"x":1
}
""";
String nextLine ="这是一段文本,他很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长";
String nextLineNew = """
这是一段文本,他很长很长很长很长很长很长很长很长很长很\
长很长很长很长很长很长
""";
"\"表示 另起一行展示,人看起来好看,输出还是一行。
5. 增强HttpClient
Java 11实现 HTTP/2 和 Web Socket 的 HTTP 客户端 API的标准化。(此部分篇幅较大,需另起博文编写)
二、JVM特性
JDK9默认使用G1垃圾回收器
JDK11中引入了ZGC 垃圾收集器,在 Java15中达到可用状态