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升高性能下降
解决方法
预热:初始让程序自动运行热点代码几百次
流量控制:启动时小流量,运行几分钟后再放到正常流量