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

你可能感兴趣的:(java)