Java 9 vs Java 8:引入模块化和JShell的全面升级

article/2025/9/21 1:38:21

在这里插入图片描述

Java 9 是 Java 语言的一个重大版本升级,带来了许多新的特性和改进。

在本篇博客中,我将为您介绍 Java 9 的一些重要特性。

🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

目录

  • 一、模块化
  • 二、JShell
  • 三、接口的私有方法
  • 四、改进的 try-with-resources
  • 五、改进的 Streams API
  • 六、改进的 HttpClient API
  • 七、模块化系统
  • 八、Java8和Java9的区别
  • 总结

一、模块化

Java 9 的最大变化是模块化。在 Java 9 之前,Java 应用程序只能以 jar 文件的形式发布和部署。这意味着应用程序中的所有类和依赖项都被打包在一个文件中。这种方式在应用程序变得越来越庞大和复杂时变得不太可行。

Java 9 引入了模块化系统,使应用程序能够分解为更小、更可维护的部分。这些部分称为模块,每个模块都具有自己的命名空间,可以指定其导出和使用的包。这样一来,开发人员就可以更好地控制应用程序的组织结构,减少类之间的冲突,并提高应用程序的安全性。

下面是一个简单的Java 9模块化示例代码:

模块module-info.java文件:

module mymodule {exports com.example.mymodule;
}

Java类文件:

package com.example.mymodule;public class MyClass {public void sayHello() {System.out.println("Hello from mymodule!");}
}

在该示例中,模块名称为“mymodule”,并且将“com.example.mymodule”包导出以供其他模块使用。MyClass是该包中的一个类,它有一个简单的方法sayHello(),在其中打印一条简单的消息。这个示例可以通过使用javac编译器编译,并使用java命令执行来运行。

二、JShell

JShell 是 Java 9 中一个非常实用的新功能,它是一个交互式的 Java 编程环境。与传统的 Java 编辑器不同,JShell 可以让您在一个交互式窗口中直接输入和执行 Java 代码。这意味着您可以在 JShell 中立即尝试Java 代码片段,无需编写和编译整个程序。JShell 还提供了自动补全和错误提示等功能,使编写 Java 代码变得更加容易和高效。

例如,您可以在 JShell 中尝试以下代码片段:

int a = 10;
int b = 20;
int c = a + b;
System.out.println(c);

JShell 会立即执行这段代码,并输出结果 30。这使得您可以更快地尝试和测试 Java 代码,以及进行一些快速的实验和验证。

三、接口的私有方法

在 Java 9 中,接口可以定义私有方法。这意味着您可以在接口内部编写一些辅助方法,这些方法不会被接口的实现类继承或访问。这样一来,接口的实现类就可以更加清晰和简洁,而不必包含一些不必要的方法。

例如,您可以在接口中定义以下私有方法:

private static void printHello() {System.out.println("Hello");
}

这个私有方法只能在接口内部使用,不能在实现类中使用或继承。

四、改进的 try-with-resources

在 Java 9 中,try-with-resources 语句得到了改进。现在,您可以在 try-with-resources 语句中使用已经声明的资源,而不需要再次声明它们。这使得代码更加简洁和易读。

例如,您可以使用以下代码:

InputStream inputStream = new FileInputStream("file.txt");
try (inputStream) {// 处理输入流
} catch (IOException e) {// 处理异常
}

在这个例子中,inputStream 已经在外部声明,可以在 try-with-resources 语句中直接使用。

五、改进的 Streams API

Java 9 中还改进了 Streams API,使其更加强大和易用。其中一个改进是引入了三个新方法:takeWhile、dropWhile 和 ofNullable。

takeWhile 方法可以从流中获取满足某个条件的元素,直到不再满足条件为止。dropWhile 方法则可以丢弃满足某个条件的元素,直到不再满足条件为止。ofNullable 方法可以创建一个流,其中包含一个非空值或空流,具有更好的空值处理能力。

例如,您可以使用以下代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream().dropWhile(n -> n % 2 != 0).collect(Collectors.toList());

在这个例子中,evenNumbers 包含了所有偶数,丢弃了第一个不是偶数的元素。

六、改进的 HttpClient API

Java 9 中还引入了一个新的 HttpClient API,以取代过时的 HttpURLConnection 和 Apache HttpClient。新的 HttpClient API 更加简单易用,支持HTTP/2 和 WebSocket,提供了更好的性能和可扩展性。它还提供了更丰富的功能,如对 HTTP 请求和响应的流处理、支持异步请求和响应等。

例如,您可以使用以下代码创建一个新的 HttpClient 实例并发出一个 GET 请求:

HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("https://www.example.com")).GET().build();
HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
System.out.println(httpResponse.body());

这个例子中,我们创建了一个新的 HttpClient 实例,然后使用 HttpRequest 构建器创建了一个 GET 请求。最后,我们使用 HttpClient 的 send 方法发出请求,并使用 HttpResponse.BodyHandlers.ofString() 指定响应的处理方式为字符串。最后,我们输出了响应体。

七、模块化系统

Java 9 中引入了一个全新的模块化系统,也称为 Java 平台模块系统(Java Platform Module System,JPMS)。模块化系统可以帮助开发人员更好地管理和组织代码,使其更加可维护、可扩展和可重用。

模块化系统将代码组织成模块,每个模块都有自己的名称、版本号和依赖关系。模块之间可以明确地指定依赖关系,使得代码更加清晰和可维护。

例如,您可以使用以下代码定义一个简单的模块:

module com.example.myapp {requires java.base;requires java.sql;exports com.example.myapp;
}

在这个例子中,我们定义了一个名为 com.example.myapp 的模块,该模块需要 java.base 和 java.sql 模块,同时导出了 com.example.myapp 包。

通过模块化系统,开发人员可以更好地管理依赖关系,减少代码冲突和重复,使代码更加可维护和可重用。

八、Java8和Java9的区别

特性Java 8Java 9
模块化不支持支持
接口私有方法不支持支持
Stream API改进无改进添加了一些新方法
改进的日期时间API支持支持
重复注解不支持支持
增强的类型推断不支持支持
try-with-resources改进不支持支持
多版本兼容JAR打包不支持支持
JShell REPL工具不支持支持
HTTP/2标准支持不支持支持
改进的性能一些改进一些改进

总结

Java 9 引入了许多新功能和改进,包括模块化系统、JShell、接口的私有方法、改进的 try-with-resources、改进的Streams API、改进的 HttpClient API 等。这些功能和改进使得 Java 9
更加强大、高效和易用,可以帮助开发人员更好地管理和组织代码,提高代码质量和可维护性。如果您还没有升级到 Java 9,那么现在是时候考虑了。


http://chatgpt.dhexx.cn/article/9AjqN1C4.shtml

相关文章

HashMap 在 JDK 1.8 后新增的红黑树结构

读完本文你将了解到&#xff1a; 点击查看 Java 集合框架深入理解 系列 - - 乾杯传统 HashMap 的缺点HashMap 在 JDK 18 中新增的数据结构 红黑树HashMap 中关于红黑树的三个关键参数HashMap 在 JDK 18 中新增的操作桶的树形化 treeifyBinHashMap 在 JDK 18 中新增的操作 红黑树…

epoll底层红黑树使用部分源码剖析:为什么使用红黑树以及如何使用红黑树

我们知道epoll的底层使用了红黑树来管理文件描述符&#xff0c;为什么会选择红黑树这种结构呢&#xff1f; 以下是个人理解&#xff1a; epoll和poll的一个很大的区别在于&#xff0c;poll每次调用时都会存在一个将pollfd结构体数组中的每个结构体元素从用户态向内核态中的一…

HashMap在jdk1.8为何引入了红黑树?

原创不易,麻烦点个关注,点个赞,谢谢各位。 二叉查找树 二叉查找树,也称有序二叉树(ordered binary tree),或已排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任…

从电路的角度理解特征阻抗

传输显得特征阻抗不是真实的电阻&#xff0c;微波技术课程会从波的角度描述特征阻抗&#xff0c;这次试图从电路的角度来理解 无损传输线是分布的L C 网络&#xff0c;假设是无限长传输线 从a,b两点看入的阻抗是相等的&#xff0c;所以可以简化成下图&#xff1a; 化简可得 这…

同轴电缆阻抗总结(电阻、阻抗、特性阻抗)

文章目录 同轴电缆电阻、阻抗、特性阻抗电阻阻抗&#xff08;Impedance&#xff09;特性阻抗 总结 同轴电缆 同轴电缆是一种电线及信号传输线&#xff0c;一般是由四层物料造成&#xff1a;最内里是一条导电铜线&#xff0c;线的外面有一层塑胶&#xff08;作绝缘体、电介质之…

传输线阻抗方程的推导

在传输线理论中&#xff0c;当一段特征阻抗为 Z 0 Z_0 Z0​ 的传输线的终端连接了一个阻抗为 Z L Z_L ZL​ 的负载时&#xff0c;看向这段传输线的输入阻抗 Z i n Z_{in} Zin​ 将不再是 Z 0 Z_0 Z0​。 传输线阻抗方程 (Transmission Line Impedance Equation) 就是计算…

PCB阻抗计算

阻抗匹配是指在能量传输时&#xff0c;要求负载阻抗要和传输线的特征阻抗相等&#xff0c;此时的传输不会产生反射&#xff0c;这表明所有能量都被负载吸收了。反之则在传输中有能量损失。在高速PCB设计中&#xff0c;阻抗的匹配与否关系到信号的质量优劣&#xff0c;下面简单介…

特征阻抗和阻抗匹配_没有诸如对象关系阻抗不匹配之类的东西

特征阻抗和阻抗匹配 过去十年来&#xff0c;ORM的许多批评都错了这一点&#xff0c;因为它不准确。 到本文结尾&#xff0c;我们将得出以下结论&#xff1a; 关系&#xff08;数据&#xff09;模型和面向对象的模型之间没有显着差异 如何得出这个结论&#xff1f; 继续阅读&a…

传输线特征阻抗计算

一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教! 在计算阻抗之前,我想很有必yi要理解这儿阻抗的意义 传输线阻抗的由来以及意义 传输线阻抗是从电报方程推导出来(具体可以查询微…

PCB特征阻抗计算

见教程&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1V4UbEoKfMD1bilwu-Qwdyg 密码&#xff1a;ml6t

射频特征阻抗

Characteris Impendance(特性阻抗&#xff0c;也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一&#xff0c;但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。 &#xff08;如果您检查10个不同的来源&#xff0c;您会看到1…

高速PCB的特征阻抗设计

我们在高速PCB设计当中,经常对高速信号线做特征阻抗控制来优化信号质量。那特征阻抗是什么东西呢? 1.传输线原理 介绍特征阻抗之前,我们复习下《信号完整性视频》介绍的传输线基本原理。如下图左边是低频电路采用集总参数的RLGC模型,右边高频电路采用分布参数的RLGC模型。…

传输线的波阻抗与特征阻抗

以上是时域方程&#xff0c;而我们的“波阻抗”是定义在频域下的&#xff08;正弦激励&#xff09;。 1&#xff09;“相电压/电流”的第一、二项分别代表了前向传输、反向传输分量&#xff1b; 2&#xff09;前向传输和反向传输分量两者无必然联系。 补充修改&#xff1a; 1&…

PCB寄生参数和特征阻抗

1、微带线Microstrip 相同情况下&#xff0c;PCB板厚H越厚&#xff08;影响很大&#xff09;&#xff1a; 特征阻抗越大&#xff08;H↑ > ln()↑ > Z0↑&#xff09;传输延时几乎不变&#xff08;与H无关&#xff09;寄生电感越大&#xff08;H↑ > ln()↑ > L…

传输线的特征阻抗

要理解特征阻抗首先要建立一个模型。传输线零阶模型 在这个模型中&#xff0c;每一个步长是△X&#xff0c;单位长度的电容为CL&#xff0c;所以每个步长的电容 CCL*△X 然后我们根据电荷量 QU*CI*t &#xff0c;电流I Q / t C * U / t&#xff0c;其中t △X / v得到 电流 …

阻抗,特征阻抗与等效阻抗

目录 一、阻抗 二、 特征阻抗 三、等效阻抗 射频的黄金三角之一就是阻抗&#xff0c;我们在射频设计中&#xff0c;会经常与阻抗打交道&#xff0c;比如特征阻抗&#xff0c;负载阻抗&#xff0c;阻抗匹配等等。更多的时候&#xff0c;我们所设计的射频电路就是一个阻抗匹配…

特性阻抗介绍

特性阻抗:又称“特征阻抗”,它不是直流电阻,属于长线传输中的概念。在高频范围内,信号传输过程中,信号沿到达的地方,信号线和参考平面(电源或地平面)间由于电场的建立,会产生一个瞬间电流,如果传输线是各向同性的,那么只要信号在传输,就始终存在一个电流I,而如果信…

单播、广播和多播地址以及组播ip与组播mac间的换算

转自&#xff1a;https://www.cnblogs.com/songdada/articles/4039468.html 除地址类外&#xff0c;还可根据传输的消息特征将IP地址分为单播、广播或多播。主机使用IP地址进行一对一&#xff08;单播&#xff09;、一对多&#xff08;多播&#xff09;或一对所有&#xff08;…

IP组播----组播基础 组播服务模型、组播地址

一、简介 IPv4传输方式有三种&#xff1a;单播、组播、广播 单播&#xff1a;信息源为每个需要信息的主机都发送一份独立的报文组播&#xff1a;信息源将保温发送到一个特定的组播IP地址&#xff0c;只有加入了这个组的主机才能接收广播&#xff1a;信息源将信息发送给网段中…

组播的地址范围

2019独角兽企业重金招聘Python工程师标准>>> 组播的地址是保留的D类地址从224.0.0.0—239.255.255.255&#xff0c;而且一些地址有特定的用处如&#xff0c;224.0.0.0—244.0.0.255只能用于局域网中路由器是不会转发的&#xff0c;并且224.0.0.1是所有主机的地址&am…