java--新版本特性汇总---jdk9

写在前面:
此处总结jdk9的一些常用新特性

文章目录

  • Java9
  • 模块化
    • 重构jre将rt.jar进行拆分
    • 访问控制
    • 开发效率
    • 启动速度
  • 多版本jar(新增)
  • jshell-222(新增)
  • 私有接口 (新增)
  • try-catch-resource (加强)
  • 匿名类的<>改进 (修正)
  • _不能未做变量名(修改)
  • @SafeVarargs (修正)
  • Java集合工厂方法(api新增)
  • stream(api新增)
    • takeWhile
      • dropWhile
      • ofNullable
      • iterate 迭代生成方法
  • Optional 类(api加强)
    • stream()
    • ifPresentOrElse
    • or
  • string底层存储结构升级-254(优化)
  • 增强型Deprecation(增强)
  • jvm调优(新增)
  • 部署修改(删除)

Java9

这是一个分水岭,因为其修改很大,导致jdk8升级比较困难。怕出事又加上收费所以导致现在8还占者30%。
官方文档

模块化

引入了一个新的可选阶段,即链接时间,它介于编译时间和运行时之间,在此期间,可以将一组模块组装并优化为自定义运行时映像;请参阅 Java Platform, Standard Edition Tools Reference 中的 jlink 工具。
向工具添加选项 、 以及可在其中指定模块路径的位置,这些路径用于查找模块的定义。javacjlinkjava
介绍模块化 JAR 文件,该文件是一个 JAR 文件,其根目录中有一个文件。module-info.class
引入 JMOD 格式,这是一种类似于 JAR 的打包格式,只不过它可以包含本机代码和配置文件;请参阅 JMOD 工具。
它是一种新的Java编程组件,可以用来收集Java代码(类和包)。这个项目的主要目标是轻松地将应用程序缩小到小型设备。在Java9中,JDK本身已经划分为一组模块,以使其更加轻量级。它还允许我们开发模块化应用程序。
为什么是一个分水岭呢,和模块化有着挺大关系的,模块化之后开发变得更快了,使得java版本更新也快了。

重构jre将rt.jar进行拆分

在jdk8的时候rt.jar很大,61MB,每次运行都需要全部加载
在这里插入图片描述
而在jdk8以后就是用的jmod(这里展示的是jdk17),每次加载的时候只需要加载需要的模块

java--新版本特性汇总---jdk9_第1张图片

访问控制

在模块化之后可以通过modle-info.class进行访问控制
在这里插入图片描述

让其只需要使用导出的类,进行一个访问的控制

java--新版本特性汇总---jdk9_第2张图片

访问标志 解释
requires 允许我们声明模块依赖项
requires static 静态依赖
requires transitive 传递依赖
exports 导出
Exports … To 限制哪些模块可以访问我们的API。只能to后面的访问
uses 使用
open 可以使用反射来检查包中的每个类型和成员,甚至是私有类型和成员

开发效率

模块化分工开发更快,打包也更快

启动速度

可以按需启动

多版本jar(新增)

扩展 JAR 文件格式以允许多个特定于 Java 发行版的 在单个存档中共存的类文件的版本。

能够运行一个jar多个java版本进行运行。

jshell-222(新增)

java语言是比较繁琐的,编写学习的时候一定需要建一个类。所以在java9支持使用shell脚本的方式用java语言来进行操作。

在cmd中输入jshell
java--新版本特性汇总---jdk9_第3张图片

idea使用jshell需要在tool工具栏中打开jshell
java--新版本特性汇总---jdk9_第4张图片

私有接口 (新增)

以便将其作为一部分包含在 Java SE 8 中 添加对 Lambda 表达式的支持的努力,但被撤回以更好地专注于更高的 Java SE 8 的优先级任务。现在建议对私有接口方法提供支持,从而使接口的非抽象方法能够在它们之间共享代码。

这个是和默认方法所配合的,因为其私有特性不能被实现类所使用。能用到他的就只有默认方法了。
使得默认方法的公用代码可以抽成方法。

try-catch-resource (加强)

在java8的时候,也有try-catch-resource。
使用时

        try(BufferedInputStream inputStream = new BufferedInputStream(System.in)){
            inputStream.read();
        } catch (IOException e) {
            e.printStackTrace();
        }

但是,这个对象的范围也就限制在这里了。

但是在9之后,就可以放到外层了,但是他必须要final
可以

BufferedInputStream inputStream = new BufferedInputStream(System.in);
 try(inputStream ){
     inputStream.read();
} catch (IOException e) {
    e.printStackTrace();
}

匿名类的<>改进 (修正)

在jdk9以前匿名类的泛型不能推断。
如:

MyClass<String> myClass = new MyClass<String>(){
};

后面的泛型讲道理是应该可以推断出来的,但是在jdk9以前是不可以的。

_不能未做变量名(修改)

从jdk9开始_是一个关键词了不可以作为变量名

@SafeVarargs (修正)

它是应用于接受 varargs 参数的方法或构造函数的注释。它用于确保方法不会对其 varargs参数执行不安全的操作。
用于消除编译器的警告,用于自己保证代码不会出现不安全的清空。

为什么会不安全呢。
可变参数的时候,如果也用到了泛型就可能导致代码出错。
下面代码是允许的,那么我们在使用的时候就很可能出错。

public List<String>[] test(List<String> obj){
	Object[] a = obj;
	a[0] = List.of(1,2,3);
	return a;
}

Java集合工厂方法(api新增)

Java 9引入了一些改进的集合工厂方法,使得创建和初始化集合对象变得更加简洁和方便。这些改进包括List.of()、Set.of()和Map.of()等方法,用于创建不可变的集合对象。本教程将介绍Java 9改进的集合工厂方法的使用和注意事项。
可以使用下面来快速创建集合,但是这个集合是不可变的,不能修改的。

List list = List.of(1,3,4,5,6);

注意list和set是可以无限制的一直加参数的(可变参数)map最大只能10个(api遍历实现)

stream(api新增)

Java 9 改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。

takeWhile

保留断言为true的语句,直接第一次返回false
返回给定 Stream 的子集直到断言语句第一次返回 false。
如果第一个就不满足则返回空stream

        System.out.println(Stream.of("1", "2", "3", "4").takeWhile("1"::equals).toList());
        System.out.println(Stream.of("1", "2", "3", "4").takeWhile("2"::equals).toList());
        System.out.println(Stream.of(1,2, 3, 4).takeWhile(i->i<3).toList());
[1]
[]
[1, 2]

dropWhile

和takeWhile相反。
删除断言语句为true的,直到第一次返回false停止

        System.out.println(Stream.of("1", "2", "3", "4").dropWhile("1"::equals).toList());
        System.out.println(Stream.of("1", "2", "3", "4").dropWhile("2"::equals).toList());
        System.out.println(Stream.of(1,2,3,4).dropWhile(i->i<3).toList());
[2, 3, 4]
[1, 2, 3, 4]
[3, 4]

ofNullable

可以预防 NullPointerExceptions 异常,如果为null则会返回一个空的stream。

    public static void main(String[] args) {
        StreamStudy study = new StreamStudy();
        study.ofNullable(List.of(1,2,3));
        study.ofNullable(null);
    }

    public void ofNullable(List list) {
        Stream.ofNullable(list).forEach(System.out::println);
    }
[1, 2, 3]

iterate 迭代生成方法

迭代生成方法
iterate(起始值,结束条件,下一个元素生成逻辑)
如我想生成起始为3间隔为4大小小于100的集合

System.out.println(Stream.iterate(3, i -> i < 100, i -> i + 4).toList());
[3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99]

Optional 类(api加强)

Optional 类的引入很好的解决空指针异常

stream()

生成一个stream流,将 Optional 转为一个 Stream

    public static void main(String[] args) {
        OptionStudy study = new OptionStudy();
        study.streamAndNullable(null);
        study.streamAndNullable(List.of(1,2,3,4));
    }
    public <T> void streamAndNullable(T value) {
        Optional.ofNullable(value).stream().forEach(System.out::println);
    }

ifPresentOrElse

如果存在执行第一个,不存在执行第二个参数。

    public static void main(String[] args) {
        OptionStudy study = new OptionStudy();
        study.ifPresentOrElse(null);
        study.ifPresentOrElse(List.of(1,2,3,4));
    }

    public <T> void ifPresentOrElse(T value) {
        Optional.ofNullable(value).ifPresentOrElse(System.out::println, () -> System.out.println("value is null"));
    }
value is null
[1, 2, 3, 4]

or

如果存在返回指定值,否则返回or的值

    public static void main(String[] args) {
        OptionStudy study = new OptionStudy();
        study.or(null);
        study.or("有");
    }
    public <T> void or(String value) {
        Optional.ofNullable(value).or(() -> Optional.of("无参数")).ifPresent(System.out::println);
    }
无参数
有

string底层存储结构升级-254(优化)

概括: 对字符串采用更节省的内部表示

实现: 用byte数组(1字节)代替char数组(2字节)

jdk8以前:使用char[]表示所有的字符

jdk8以后:使用byte[],那么如果有中文需要2字节怎么办呢。那就用2位byte表示一个字。
用一个标志位code代表该字符串是1位还是2位,如果code是0则是LATIN1字符集,如果是1则是UTF16
java--新版本特性汇总---jdk9_第5张图片
java--新版本特性汇总---jdk9_第6张图片

增强型Deprecation(增强)

对 @Deprecated 注释进行了改进,以提供有关API的状态和预期处置得更好信息。添加了以下新元素。

@Deprecated(forremovation=true@Deprecated(since=“version”)

jvm调优(新增)

  • 提高 G1 可用性、确定性和性能,增强了垃圾优先 (G1) 垃圾回收器
  • 统一 JVM 日志记录
  • 删除 JDK 8 中不推荐使用的 GC 组合
  • 将 G1 设为默认垃圾回收器

部署修改(删除)

  • 弃用 Java 插件
  • 增强的 Java 控制面板
  • 模块化 Java 应用程序打包
  • 弃用小程序 API

你可能感兴趣的:(java基础,java,开发语言,学习)