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

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

文章目录

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),每次加载的时候只需要加载需要的模块

访问控制

在模块化之后可以通过modle-info.class进行访问控制

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

访问标志 解释
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

idea使用jshell需要在tool工具栏中打开jshell

私有接口 (新增)

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

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

使得默认方法的公用代码可以抽成方法。

try-catch-resource (加强)

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

使用时

java 复制代码
        try(BufferedInputStream inputStream = new BufferedInputStream(System.in)){
            inputStream.read();
        } catch (IOException e) {
            e.printStackTrace();
        }

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

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

可以

java 复制代码
BufferedInputStream inputStream = new BufferedInputStream(System.in);
 try(inputStream ){
     inputStream.read();
} catch (IOException e) {
    e.printStackTrace();
}

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

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

如:

java 复制代码
MyClass<String> myClass = new MyClass<String>(){
};

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

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

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

@SafeVarargs (修正)

它是应用于接受 varargs 参数的方法或构造函数的注释。它用于确保方法不会对其 varargs参数执行不安全的操作。

用于消除编译器的警告,用于自己保证代码不会出现不安全的清空。

为什么会不安全呢。

可变参数的时候,如果也用到了泛型就可能导致代码出错。

下面代码是允许的,那么我们在使用的时候就很可能出错。

java 复制代码
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改进的集合工厂方法的使用和注意事项。

可以使用下面来快速创建集合,但是这个集合是不可变的,不能修改的。

java 复制代码
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

java 复制代码
        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停止

java 复制代码
        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。

java 复制代码
    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的集合

java 复制代码
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

java 复制代码
    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

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

java 复制代码
    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的值

java 复制代码
    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

增强型Deprecation(增强)

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

java 复制代码
@Deprecated(forremovation=true)
@Deprecated(since="version")

jvm调优(新增)

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

部署修改(删除)

  • 弃用 Java 插件
  • 增强的 Java 控制面板
  • 模块化 Java 应用程序打包
  • 弃用小程序 API
相关推荐
小小深12 分钟前
了解JVM
java·jvm
Sunlight_77718 分钟前
第五章 SQLite数据库:1、SQLite 基础语法及使用案例
java·linux·服务器·jvm·数据库·tcp/ip·sqlite
JhonKI28 分钟前
【从零实现高并发内存池】内存池整体框架设计 及 thread cache实现
java·redis·缓存
何似在人间57535 分钟前
SpringAI+DeepSeek大模型应用开发——4 对话机器人
java·机器人·大模型应用开发·spring ai
Susea&36 分钟前
数据结构初阶:双向链表
c语言·开发语言·数据结构
虾球xz1 小时前
游戏引擎学习第230天
c++·学习·游戏引擎
pianmian11 小时前
arcgis几何与游标(1)
开发语言·python
-曾牛1 小时前
【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码
java·开发语言·人工智能·spring boot·ai·chatgpt
kfepiza1 小时前
HttpSessionListener 的用法笔记250417
java·笔记·servlet·tomcat
冬天vs不冷1 小时前
SpringBoot条件注解全解析:核心作用与使用场景详解
java·spring boot·python