JDK9与JDK8对比

JDK 9 带来了很多显著的新特性,较早期的版本有了非常多的提升和优化。以下将以清晰的对比方式讲解 JDK 9 相比旧版本的优势,并通过实际示例展示如何利用新特性。

1. 模块化系统(Project Jigsaw)

JDK 8 及之前:
所有的 Java 类都在一个巨大的类库中,JDK 无法轻松拆分为不同部分。大型项目会有类冲突、依赖混乱等问题,模块间的依赖关系难以管理。

JDK 9:
JDK 9 引入了 模块化系统,将 JDK 拆分为多个模块,使得开发者可以构建更小的、仅包含必要模块的应用。模块系统允许显式声明模块的依赖关系,避免模块依赖的混乱。

优势:

  • 减少类加载冲突
  • 构建更小的自定义 JRE
  • 提高代码维护性和安全性

示例:
在 JDK 9 中,开发者可以使用 module-info.java 文件声明模块:

module com.example.module {exports com.example.module;  // 模块导出包requires java.sql;           // 声明依赖
}

通过 jlink 构建定制化 JRE:

jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.sql --output custom-runtime

2. HTTP/2 Client API

JDK 8 及之前:
之前使用 HttpURLConnection 或第三方库(如 Apache HttpClient)来发送 HTTP 请求,代码通常比较冗长,且不支持 HTTP/2。

// HttpURLConnection 示例
URL url = new URL("http://example.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {content.append(inputLine);
}
in.close();
con.disconnect();
System.out.println(content.toString());

JDK 9:
引入了 新的 HTTP/2 Client API,支持异步处理和 WebSocket,简化了 HTTP 请求的编写,特别是对于 HTTP/2 的支持。相比 HTTP/1.1,HTTP/2 支持多路复用,头部压缩,更有效的连接管理。

// HTTP/2 Client 示例
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://example.com")).build();client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println).join();

优势:

  • 支持 HTTP/2 和 WebSocket
  • 异步操作更方便
  • 不再需要依赖第三方库

3. JShell(交互式 REPL)

JDK 8 及之前:
在 JDK 8 及之前的版本中,Java 开发者无法在命令行中进行简单的代码实验。需要编写完整的类、方法,编译和运行后才能看到效果。

JDK 9:
引入了 JShell,这是 Java 的交互式 REPL(Read-Eval-Print Loop)工具,允许开发者快速实验代码片段而不需要编写完整的类和方法。

优势:

  • 适合初学者学习和实验
  • 提高开发和测试效率

示例:
启动 JShell 并测试:

$ jshell
jshell> int a = 5;
jshell> System.out.println(a * 2);  // 输出 10

4. 增强的集合工厂方法

JDK 8 及之前:
创建不可变集合需要手动实现,或者使用 Collections.unmodifiableList(),代码较为冗长且不够直观。

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> unmodifiableList = Collections.unmodifiableList(list);

JDK 9:
引入了 新的集合工厂方法,例如 List.of()Set.of()Map.of(),可以直接创建不可变集合。

List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("x", "y", "z");
Map<String, Integer> map = Map.of("key1", 1, "key2", 2);

优势:

  • 更简洁、易读
  • 代码少且更易维护

5. 私有接口方法

JDK 8 及之前:
接口中只能定义抽象方法或 defaultstatic 方法,若有公共逻辑,只能定义为默认方法,无法进一步封装。

JDK 9:
JDK 9 允许在接口中定义私有方法,使接口逻辑更加封装,减少代码重复。

interface MyInterface {default void showMessage() {System.out.println(getMessage());}private String getMessage() {return "Hello, Private Method!";}
}

优势:

  • 代码复用,减少冗余逻辑
  • 提高接口的内聚性

6. 多版本 JAR 文件

JDK 8 及之前:
JAR 文件只能适应单个版本的 JVM,若需要支持多个 JDK 版本,开发者只能通过不同的 JAR 文件或条件编译来解决。

JDK 9:
支持 多版本 JAR 文件,允许在同一个 JAR 文件中包含多个版本的类文件,以便不同 JDK 版本能够加载适合自己的类。

META-INF/versions/9/com/example/MyClass.class

优势:

  • 在同一 JAR 中支持多个 Java 版本,增强兼容性

7. G1 垃圾收集器默认启用

JDK 8 及之前:
JDK 8 默认使用 Parallel GC,适合高吞吐量的应用,但在暂停时间控制上表现较差。若需低暂停的 GC,开发者需手动启用 G1 GC。

JDK 9:
JDK 9 将 G1 GC 设置为默认垃圾收集器,G1 旨在减少最大暂停时间,适合大多数服务器应用场景。

优势:

  • 更好地控制暂停时间,适合低延迟应用

8. jlink - 自定义 Java 运行时

JDK 8 及之前:
JDK 8 不支持创建自定义的运行时环境,开发者只能通过完整的 JDK 或 JRE 部署应用,内存占用较大,且包含许多不必要的模块。

JDK 9:
通过 jlink 工具,开发者可以构建仅包含必要模块的自定义运行时环境,减小部署包大小,特别适合嵌入式设备或云端微服务。

jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging --output custom-jre

优势:

  • 减少应用占用的内存和磁盘空间
  • 适用于资源受限的环境

总结

JDK 9 的新特性在模块化设计、集合处理、HTTP 客户端、垃圾收集等方面提供了更简洁、更高效的解决方案。相比 JDK 8,它更适合现代软件开发场景,如微服务、云原生应用和异步编程,开发者可以更轻松地编写高效、灵活的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之二:生产服务器的备份操作

从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之二&#xff1a;生产服务器的备份操作 目录 从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之二&#xff1a;生产服务器的备份操作一、创建 pfile 文件二、创建备份…

CSS外边距

元素的外边距&#xff08;margin&#xff09;是围绕在元素边框以外&#xff08;不包括边框&#xff09;的空白区域&#xff0c;这片区域不受 background 属性的影响&#xff0c;始终是透明的。 为元素设置外边距 默认情况下如果不设置外边距属性&#xff0c;HTML 元素就是不会…

CSS 中 object-fit 的 cover 和 contain

前言&#xff1a;object-fit 属性用于指定可替换元素&#xff08;如<img>、<video>等&#xff09;如何适应其容器。 一、视觉效果 1. object-fit: cover 此值会使被替换元素完全覆盖容器&#xff0c;同时保持其宽高比。这意味着元素可能会被裁剪以适应容器的尺寸…

Linux shell编程学习笔记84:tee命令——显示保存两不误

0 引言 在前面的学习笔记中&#xff0c;我们经常使用echo命令和输出重定向来生成脚本文件或演示文件&#xff0c;其实Linux提供了一个可以从标准输入读取数据&#xff0c;并输出成文件的命令——tee。 1 tee命令 的帮助信息、功能、命令格式、选项和参数说明 1.1 tee命令 的…

OpenCV-指纹识别

文章目录 一、意义二、代码实现1.计算匹配点2.获取编号3.获取姓名4.主函数 三、总结 一、意义 使用OpenCV进行指纹识别是一个复杂且挑战性的任务&#xff0c;因为指纹识别通常需要高精度的特征提取和匹配算法。虽然OpenCV提供了多种图像处理和计算机视觉的工具&#xff0c;但直…

软件测试学习笔记丨Pytest 学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 基本介绍 pytest框架是一个成熟&#xff0c;全面的测试框架&#xff0c;具有非常丰富的第三方插件&#xff0c;并且可以自定义扩展 比如&#xff1a;pytest-selenium , pytest-html ,…

MySQL高阶2004-职员招聘人数

目录 题目 准备数据 分析数据 实现 题目 一家公司想雇佣新员工。公司的工资预算是 70000 美元。公司的招聘标准是&#xff1a; 雇佣最多的高级员工。在雇佣最多的高级员工后&#xff0c;使用剩余预算雇佣最多的初级员工。 编写一个SQL查询&#xff0c;查找根据上述标准雇…

elasticsearch 写入新数据测试(二)

背景:elasticsearch单个node节点写入数据-CSDN博客 需要设置密码才能作为外部调用,不设置我不会用。设置方法见上一篇。 设置密码出现如下问题: Unexpected response code [503] from calling PUT http://172.19.0.1:9200/_security/user/apm_system/_password?pretty …

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

unity一键注释日志和反注释日志

开发背景&#xff1a;游戏中日志也是很大的开销&#xff0c;虽然有些日志不打印但是毕竟有字符串的开销&#xff0c;甚至有字符串拼接的开销&#xff0c;有些还有装箱和拆箱的开销&#xff0c;比如Debug.Log(1) 这种 因此需要注释掉&#xff0c;当然还需要提供反注释的功能&am…

ide 使用技巧与插件推荐

ide 使用技巧与插件推荐 一、IDE 使用技巧 1. 快捷键 掌握常用快捷键&#xff1a; Windows: 使用 Ctrl、Alt 和 Shift 的组合。 Mac: 使用 Cmd、Option 和 Shift。 常用快捷键示例&#xff1a; VS Code: Ctrl P: 快速打开文件。 Ctrl Shift P: 打开命令面板。 Ctrl /…

前端 vue3 对接科大讯飞的语音在线合成API

主要的功能就是将文本转为语音&#xff0c;可以播放。 看了看官方提供的demo&#xff0c;嗯....没看懂。最后还是去网上找的。 网上提供的案例&#xff0c;很多都是有局限性的&#xff0c;我找的那个他只能读取第一段数据&#xff0c;剩下的不读取。 科大讯飞的接口&#xf…

监控告警功能详细介绍及操作演示:运维团队的智能保障

在当今这个信息化高速发展的时代&#xff0c;运维团队面临着前所未有的挑战。为了确保系统的稳定性和高效运维&#xff0c;监控告警功能成为了运维团队不可或缺的得力助手。本文将详细介绍我们的监控告警功能&#xff0c;并结合实际操作页面进行演示&#xff0c;帮助运维团队更…

25中国烟草校园招聘面试问题总结 烟草面试全流程及面试攻略

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费&#xff01;全文干货。 工作招聘无领导小组面试全攻略最常见面试题&#xff08;第一部分&#xff09;共有17章可用于国企私企合资企业工作招聘面试面试必备心得面试总结资源-CSDN文库https://d…

springboot整合seata

一、准备 docker部署seata-server 1.5.2参考&#xff1a;docker安装各个组件的命令 二、springboot集成seata 2.1 引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>&…

sql 时间交集

任务&#xff08;取时间交集&#xff09; 前端输入开始时间和结束时间&#xff0c;通过sql筛选出活动开始时间和活动结束时间再开时时间和结束时间有交集的活动 想法&#xff1a; 前后一段时间内遇到了类似取交集的&#xff0c;从网上找到了两种写法&#xff0c;再结合GPT等…

【架构】NewSQL

文章目录 NewSQLTiDBTiDB 主要组件特点使用场景安装与部署 推荐阅读 NewSQL NewSQL是一种数据库管理系统(DBMS)的类别&#xff0c;它结合了NoSQL数据库的可扩展性和传统SQL数据库的事务一致性。具体来说&#xff0c;NewSQL数据库旨在解决传统关系型数据库在处理大规模并发事务…

C# C++ 笔记

第一阶段知识总结 lunix系统操作 1、基础命令 &#xff08;1&#xff09;cd cd /[目录名] 打开指定文件目录 cd .. 返回上一级目录 cd - 返回并显示上一次目录 cd ~ 切换到当前用户的家目录 &#xff08;2&#xff09;pwd pwd 查看当前所在目录路径 pwd -L 打印当前物理…

[大语言模型-论文精读] 利用多样性进行大型语言模型预训练中重要数据的选择

[大语言模型-论文精读] 利用多样性进行大型语言模型预训练中重要数据的选择 论文信息&#xff1a; Harnessing Diversity for Important Data Selection in Pretraining Large Language Models Authors: Chi Zhang, Huaping Zhong, Kuan Zhang, Chengliang Chai, Rui Wang, X…

Techpoint(科点)—TP2912-GB 视频编码器芯片详解

写在前面 本系列文章主要讲解Techpoint(科点)—TP2912-GB 视频编码器芯片的相关知识,希望能帮助更多的同学认识和了解Techpoint(科点)—TP2912-GB 视频编码器芯片。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 此次架构中TP2912-GB作为视频编码器使用,下面将详细…