八个理由:从java8升级到Java17

目录

前言

1. 局部变量类型推断

2.switch表达式

3.文本块

4.Records

5.模式匹配instanceof

6. 密封类

7. HttpClient

8.性能和内存管理能力提高


前言

从Java 8 到 Java 20,Java 已经走过了漫长的道路,自 Java 8 以来,Java 生态系统发生了很多变化。最显着的变化是 Java 的发布节奏。Java 8 于 2014 年发布,Java 17 于 2021 年发布。这两个版本之间相隔了 7 年。Java17是一个长期支持(LTS)的版本,会有更稳定和持久的维护和更新。

1. 局部变量类型推断

这是自 Java 8 以来添加到 Java 中的最受欢迎的功能之一。它允许你在不指定类型的情况下声明局部变量。类型是从表达式的右侧推断出来的。此功能也称为var类型。

var name = "John"; // 推断name的类型为String
var age = 25; // 推断age的类型为intSystem.out.println(name); // 输出:John
System.out.println(age); // 输出:25

需要注意的是,var类型的局部变量仍然具有静态类型,一旦被推断出来,类型就会固定下来,并且不能重新赋值为不兼容的类型。

2.switch表达式

在 Java 14 中使用 switch 表达式时,你不必使用关键字break来跳出 switch 语句或return在每个 switch case 上使用关键字来返回值;相反,你可以返回整个 switch 表达式。这种增强的 switch 表达式使整体代码看起来更清晰,更易于阅读。

来看一个需求:根据不同的月份,返回相应的季节名称。

传统java8

int month = 9;
String season;switch (month) {case 12:case 1:case 2:season = "Winter";break;case 3:case 4:case 5:season = "Spring";break;case 6:case 7:case 8:season = "Summer";break;case 9:case 10:case 11:season = "Autumn";break;default:throw new IllegalArgumentException("Invalid month: " + month);
}System.out.println(season); // 输出:Autumn

java14switch表达式用法

int month = 9;String season = switch (month) {case 12, 1, 2 -> "Winter";case 3, 4, 5 -> "Spring";case 6, 7, 8 -> "Summer";case 9, 10, 11 -> "Autumn";default -> throw new IllegalArgumentException("Invalid month: " + month);
};System.out.println(season); // 输出:Autumn

Java 14还引入了新的关键字yield,用于从switch表达式中返回一个值。使用yield可以提高代码的可读性,并且可以在一个case块中计算多个结果

String season = switch (month) {case 12, 1, 2 -> {yield "Winter";}case 3, 4, 5 -> {yield "Spring";}case 6, 7, 8 -> {yield "Summer";}case 9, 10, 11 -> {yield "Autumn";}default -> throw new IllegalArgumentException("Invalid month: " + month);
};

3.文本块

文本块是 Java 15 中添加的一项新功能。它允许你在不使用转义序列的情况下创建多行字符串。这在你创建 SQL 查询或 JSON 字符串时非常有用。在下面的示例中,你可以看到使用文本块时代码看起来更加简洁。

4.Records

记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类,但代码少得多;大多数开发人员使用 Lombok 生成 POJO 类,但是有了记录,你就不需要使用任何第三方库。在下面的对比示例中,你可以看到创建记录类所需的代码非常少。

传统java8

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}//getter,setter,equaes,hashCode..........}

使用 Lombok

import lombok.Data;@Data
public class Person {private String name;private int age;
}

java14Records

public record Person(String name, int age) {}

需要注意的当使用记录类时,字段被声明为final,因此它们的值在对象创建后不能被修改。如果你尝试直接修改记录类的字段值,编译器会报错。它适用于那些不需要在运行时修改的不变数据类。

5.模式匹配instanceof

模式匹配instanceof是 Java 16 中添加的一项新功能。它允许你将instanceof运算符用作返回已转换对象的表达式。当你使用嵌套的 if-else 语句时,这非常有用。在下面的示例中,你可以看到我们如何使用instanceof运算符来捕获Employee对象,而不是进行显式转换。

6. 密封类

密封类是添加到 Java 17 中的一项新功能。它允许你将类或接口的继承限制为一组有限的子类。当你想将类或接口的继承限制为一组有限的子类时,这非常有用。在下面的示例中,你可以看到我们如何使用sealed关键字将类的继承限制为一组有限的子类。

你可以通过在类的声明前加上sealed关键字来将该类声明为密封类。然后,你可以使用permits关键字列出该密封类允许继承的子类。这些子类必须直接或间接地继承自密封类。这样,只有在这个预定义的子类中,才能继承该密封类

//使用permits关键字列出了允许继承的子类Circle、Rectangle和Triangle
public sealed class Shape permits Circle, Rectangle, Triangle {// 省略实现
}final class Circle extends Shape {// 省略实现
}final class Rectangle extends Shape {// 省略实现
}final class Triangle extends Shape {// 省略实现
}

7. HttpClient

Java 11 引入了一个新的标准 HTTP 客户端 API,名为 HttpClient。这个 API 提供了一种现代化和灵活的方式来进行网络通信,相对于以前的 HttpURLConnection,它更易于使用和扩展,也提供了更强大的功能

// 创建 HttpClient 实例
HttpClient httpClient = HttpClient.newHttpClient();// 创建 HttpRequest 实例
HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build();// 发送 GET 请求并获取响应
HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());// 输出响应内容
System.out.println(httpResponse.body());

8.性能和内存管理能力提高

Java 17 引入了两个新的垃圾回收器算法:ZGC 和 Shenandoah,并对现有的 G1 垃圾回收器进行了一些优化和改进,提高了性能和内存管理。

ZGC

ZGC 是一个低延迟、可扩展的垃圾回收器,它的设计目标是在几毫秒甚至是亚毫秒级别内完成垃圾回收操作。ZGC 能够处理非常大的堆内存,最大支持 16TB 的堆内存大小。

ZGC 使用了不同于传统垃圾回收器的分代模型,它将整个堆内存划分为若干个连续的内存区域,称为「任意内存区间」(Arbitrary Memory Ranges,AMRs),并将每个 AMR 都视为独立的对象组。这种设计可以让 ZGC 更好地处理非连续内存分配和释放操作,从而避免了传统分代垃圾回收器中可能出现的内存碎片问题。

ZGC 还使用了一些高级技术,如并发线程根扫描、无需暂停的对象分配、指针压缩等,以提高垃圾回收的效率和性能。

Shenandoah

Shenandoah 是另一个低延迟、可扩展的垃圾回收器,它的设计目标也是在几毫秒内完成垃圾回收操作。Shenandoah 采用了一种类似于 ZGC 的划分方式,将整个堆内存划分为若干个连续的内存区域,并使用读屏障和写屏障等技术来保证垃圾回收的正确性。

Shenandoah 还支持多个并发垃圾回收线程,可以在多核 CPU 上充分利用硬件资源,提高垃圾回收的效率。

G1 垃圾回收器优化

Java 17 还对现有的 G1 垃圾回收器进行了一些优化和改进,提高了性能和内存管理。具体来说,包括以下方面:

  • 改进了 G1 的堆内存分配策略,避免了大量的内存浪费;
  • 引入了一种新的内存池机制,能够更好地利用堆内存空间;
  • 对 G1 的日志记录机制进行了改进,可以更快地诊断和修复内存问题;
  • 改进了 G1 的垃圾回收算法,能够更好地处理大型应用程序和大型堆内存。

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

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

相关文章

基于JAVA的独居老人物资配送系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4.2 新增物资4.3 查询物资4.4 查询物资配送4.5 新增物资配送 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的独居老人物资配送系统&#xff0c;包含了社区档案、…

GitHub的2FA验证问题解决工具

文章目录 前言认识2FA开源工具使用&#xff1a;AuthenticatorPro获取AuthenticatorPro的安卓APK如何使用 参考文章 前言 打开GitHub跳出来这个提示&#xff0c;需要进行验证&#xff1a; 如何解决呢&#xff1f;方案有很多&#xff0c;我们可以使用开源的一个工具&#xff1a;…

穿越时光的镜头:2023回顾与2024展望

前言 2023 年就像一本充满着惊喜和挑战的书籍&#xff0c;它的每一页都留下了我生活中不同的痕迹。回顾过去&#xff0c;我发现了许多意想不到的成长和启示&#xff0c;也体验了生活的起起伏伏。 这篇文章是对 2023 年的一个小小总结&#xff0c;也是对未来的一点期许。在这里…

大数据HCIE成神之路之数据预处理(5)——偏态数据处理

偏态数据处理 1.1 偏态数据三种处理方案1.1.1 实验背景1.1.2 实验目标1.1.3 实验数据解析1.1.4 实验思路1.1.5 实验操作步骤步骤1 导入相关模块和 Data_to_Transform.csv 数据集步骤2 平方根法步骤3 对数转换步骤4 Box-Cox转换 1.1 偏态数据三种处理方案 1.1.1 实验背景 许多…

Apollo自动驾驶:从概念到现实的里程碑

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo Client2. Apollo Server3. Apollo Federation4. Apollo Tracing5. Apollo Codegen6. Apollo Link7. 其他工具和框架结论 &#x1f680;&#x1f…

uni-app新建页面

新建页面 一、右键点击 pages 文件夹&#xff0c;点击新建页面。 二、输入页面名称、选择创建 vue 文件、勾选创建同名目录、选择默认模板、勾选在 pages.json 中注册、点击创建即可。 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023.12.28

【网络安全】有趣的基础知识

背景 逐条记录网络安全学习中有趣的内容和知识。 内容 CNNIC&#xff08;中国互联网络信息中心&#xff09;是中国国家域名.cn的管理组织。中国互联网络信息中心于1997年6月3日组建&#xff0c;现为工业和信息化部 直属事业单位 &#xff0c;行使国家互联网络信息中心职责。…

通过栈将中缀表达式转换为等价的后缀表达式

为什么要从中缀表达式转换为等价的后缀表达式&#xff1f; →使后缀表达式包含运算符优先级的信息&#xff0c;方便计算机能理解进行运算。 什么是中缀表达式&#xff1f; →中缀表达式虽然是人类看得懂的简单算术形式&#xff0c;但对计算机来说反而复杂难以理解 什么是后缀表…

[设计模式 Go实现] 创建型~抽象工厂模式

抽象工厂模式用于生成产品族的工厂&#xff0c;所生成的对象是有关联的。 如果抽象工厂退化成生成的对象无关联则成为工厂函数模式。 比如本例子中使用RDB和XML存储订单信息&#xff0c;抽象工厂分别能生成相关的主订单信息和订单详情信息。 如果业务逻辑中需要替换使用的时候…

【Leetcode】第 378 场周赛

文章目录 100166. 检查按位或是否存在尾随零题目题意代码 100185. 找出出现至少三次的最长特殊子字符串 I题目思路代码 100184. 找出出现至少三次的最长特殊子字符串 II 100166. 检查按位或是否存在尾随零 题目 题意 这里题目要求的是或运算&#xff0c;所以原数组中只需要有…

【微服务】springboot整合skywalking使用详解

目录 一、前言 二、SkyWalking介绍 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整体架构 2.4 SkyWalking主要工作流程 三、为什么选择SkyWalking 3.1 业务背景 3.2 常见监控工具对比 3.3 为什么选择SkyWalking 3.3.1 代码侵入性极低 3.3.2 功能丰…

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数&#xff0c;通常用于回归问题。它是 L1 损失和 L2 损失的结合&#xff0c;旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…