> 文章列表 > JDK9~17新特性

JDK9~17新特性

JDK9~17新特性

jshell交互式命令行

#在控制台中
java -version
jshell
System.out.println("Hello world");
String hello = "hello world";
System.out.println(hello);

模块化开发

创建一个module-info.java类声明一个模块,一个模块只能有一个文件,且在顶层包的目录下
使用exports来声明可以被外部引用的包,可以有多个exports语句

module func1 {export com.intmall.func;
}

使用requires来声明依赖的外部的模块,可以有多个requires语句

module func2 {requires func1;
}

var局部变量推导

必须能推导出实际类型
只能用于局部变量

public class Test {public static void main(String[] args) {var test = new Test();var list = new ArrayList<>();}
}

单文件程序

JDK8及之前的版本,java需要编译后才能执行

javac Test.java
java Test

在JDK10中,可以直接执行java文件了

java Test.java

Shebang脚本

Shebang通常出现在类Unix系统的脚本中第一行,作为前两个字符

#!/bin/sh  使用sh,即Bourne shell或其它兼容shell执行脚本
#!/usr/bin/python -O  使用具有代码优化的Python执行
#!/usr/bin/php  使用PHP的命令行解释器执行

创建一个没有后缀的文件,如果test

#!D:\\Java\\jdk-17\\bin\\java --source 11
public class Test {public static void main(String[] args) {System.out.println("Hello world");}
}

使用git-bash命令行执行

cd /d/java/work/
./test

使用--source 11可以用java命令执行非.java后缀的文件

cp Test.java test.sh
java --source 11 test.sh

文本块

#双引号、回车不需要转义
public class Test {public static void main(String[] args) {String json = """{"name": "Zhang"}""";System.out.println(json);}
}

instanceof增强

public class Test {public static void main(String[] args) {Object a = "hello";if (a instanceof String) {String b = (String) a;System.out.println(b);}if (a instanceof String b) {System.out.println(b);}}
}

空指针提示

public class Test {public static void main(String[] args) {#执行时,错误信息中会包含那个变量值为null的List data = null;System.out.println(data.size());}
}

record类

纪录数据的类,自动生成类似get/set的方法;初始化后不能修改属性的值

public record TestRecord(String username, String password) {
}public class Test {public static void main(String[] args) {TestRecord testRecord = new TestRecord("Zhang", "123456");System.out.println(testRecord.username());}
}

sealed类

使用sealed显式管理类的继承关系
父类如果是sealed类,则必须至少有一个子类
sealed类的子类,必须是final,sealed,no-sealed之一

public sealed class Parent permits Child {
}#打破sealed继承规则
public non-sealed class Child extends Parent {
}public final class Child extends Parent {
}

switch增强

public class Test {public static void main(String[] args) {Object a = "hello";switch (a) {case String b -> System.out.println(b);case Integer b -> System.out.println(b);case Long b -> System.out.println(b);default -> System.out.println("default");}}
}

AOT与JIT

JIT(Just-in-Time实时编译) Java跨平台的基础
AOT(Ahead-of-Time预编译) 无法跨平台

AOT优势
启动和运行的速度快
打包体积小

AOT缺点
编译后的程序不支持跨平台
不支持动态功能,如AOP

热点应用启动时,大量请求进来,导致多个类同时触发JIT超时,CPU升高性能下降
解决方法
预热:初始让程序自动运行热点代码几百次
流量控制:启动时小流量,运行几分钟后再放到正常流量