JAVA:JDK9到21,新特性了解

一、前言

  随着Java技术的不断发展和进步,Java开发人员对于新特性的需求也越来越高。从JDK 9到JDK 21,Java发布了一系列重要的更新和改进,以满足开发人员的需求并提高应用程序的性能和安全性。本文将介绍JDK9到JDK 921的核心新特性,帮助您更好地了解这些更新对于Java开发的影响。

二、新特性&示例

1. JDK 9

1. 1 模块系统(Module System)

  JDK 9引入了模块系统,这是Java平台的一个重大改变。模块系统允许将JDK划分为多个模块,每个模块都有自己的API和明确的依赖关系。

  通过使用module-info.java文件,开发者可以定义模块的导出包、依赖的其他模块等信息。

  模块系统提高了代码的可维护性、封装性、可重用性和可测试性。

代码示例:

假设有两个模块:java9Test和java9。java9Test模块的module-info.java:module java9Test {  exports com.strrysky.bean;  
}java9模块的module-info.java`:module java9 {  requires java9Test;  
}在java9模块中,可以导入并使用java9Test模块导出的包中的类。

1.2 jShell(Java REPL)
  jShell是一个交互式Java REPL(Read-Eval-Print Loop)工具,允许开发者从命令行或终端直接运行Java代码片段。

  它使得Java代码测试、原型设计和学习变得更加容易和快速。

使用方式:

  在JDK 9的bin目录下输入jshell即可启动jShell。在jShell中,可以直接声明变量、计算表达式、执行语句等。

1.3 集合工厂方法的不可变集合

  JDK 9为集合API添加了一些新的工厂方法,用于创建不可变集合。这些方法包括List.of(), Set.of(), Map.of()等。

代码示例:

List<String> list = List.of("a", "b", "c");  
Set<String> set = Set.of("a", "b", "c");  
Map<String, Integer> map = Map.of("one", 1, "two", 2, "three", 3);

1.4 改进的Stream API功能

  JDK 9对Stream API进行了一些改进,增加了新的操作和方法。

代码示例:

List<String> list = Arrays.asList("a", "b", "c", "a", "b", "d");  
long count = list.stream()  .filter(s -> s.equals("a"))  .count(); // 计算列表中"a"的个数

1.5 多版本兼容JAR(Multi-Release JARs

  JDK 9支持在单个JAR文件中包含多个版本的类文件,以支持不同版本的Java运行时环境。

1.6. 更多的新特性和改进
  除了上述特性外,JDK 9还引入了其他多项新特性和改进,如接口私有方法、语法改进(如try-with-resources的改进)、HTTP/2客户端、改进的弃用注解@Deprecated等。这些特性和改进旨在提高Java的开发效率和代码质量

2. JDK10

2.1 局部变量类型推断
  使用var关键字进行局部变量类型推断。

代码示例:


var list = new ArrayList<String>(); // 编译器推断 list 的类型为 ArrayList<String>

3. JDK 11

3.1 String 增强

  增加了一系列的字符串处理方法。

代码示例:

String str = "Hello";  
String result = str.repeat(3); // "HelloHelloHello"

3.2 HTTP Client

  新的标准化HTTP客户端。

代码示例:

HttpClient client = HttpClient.newHttpClient();  
HttpRequest request = HttpRequest.newBuilder()  .uri(URI.create("http://example.com"))  .build();  
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()

4. JDK 12

4.1 Shenandoah低暂停时间垃圾回收器

  这是一个垃圾回收器优化,不涉及代码层面的新特性。

-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

5. JDK 13

5.1 文本块(预览语言功能
  多行字符串字面量

代码示例:

String text = """  Hello,  World!  """;

6. JDK14

6.1 switch表达式(标准)
  对 switch 进行扩展,使其既可以作为语句也可以作为表达式使用,并使这两种形式都可以使用传统的 case … : labels(有切换)或新的 case …-> 标签(无切换),另外还有一个新语句用于从 switch 表达式中产生一个值。

代码示例:

int day = 3;  
String dayType = switch (day) {  case 1, 2, 3, 4, 5 -> "Weekday";  case 6, 7 -> "Weekend";  default -> throw new IllegalArgumentException("Invalid day: " + day);  
};  
System.out.println(dayType); // 输出:Weekday

6. JDK15

6.1 文本块(Text Blocks)

  文本块是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并允许开发人员在需要时控制格式。文本块在JDK 13中首次作为预览功能出现,并在JDK 15中被确定下来。

代码示例:

public static void main(String[] args) {  String query = """  SELECT * from USER  WHERE `id` = 1  ORDER BY `id`, `name`;  """;  System.out.println(query);  
}

7. JDK16

7.1 Record记录类
  作为不可变数据的透明载体。

代码示例:

public record Point(int x, int y) { }

8. JDK17

8.1 Switch表达式增强

  JDK 17对Switch表达式进行了进一步增强,包括类型模式匹配和守卫模式。类型模式允许在switch表达式中使用instanceof,而守卫模式则可以使用布尔表达式。

代码示例:

Object obj = "Hello";  
String result = switch (obj) {  case String s && s.length() > 5 -> "String longer than 5 chars";  case String s -> "String";  case Integer i -> "Integer";  default -> "Unknown";  
};  
System.out.println(result); // 输出 "String longer than 5 chars"

8.2 文本块(Text Blocks)

  文本块允许开发者使用多行字符串字面量,而无需担心转义字符或字符串拼接。

代码示例

String json = """  {  "name": "John",  "age": 30,  "message": "Hello, World!"  }  """;  
System.out.println(json);

8.3 密封类(Sealed Classes)
  密封类限制了一个类可以被哪些其他类继承。这有助于更好地控制类的继承层次结构。

代码示例:

public sealed interface Shape permits Circle, Rectangle {  // ...  
}  public final class Circle implements Shape {  // ...  
}  public final class Rectangle implements Shape {  // ...  
}

9. JDK18

9.1 模式匹配的增强(JEP 420: Pattern Matching for switch)

  JDK 18 对模式匹配进行了进一步增强,特别是在与 switch 表达式/语句结合的部分。
引入了更丰富的模式类型,如类型模式、解构模式等,使得在 switch 中处理复杂类型更加直接和清晰。

  提供了编译时更强的类型检查,减少了运行时错误。

  简化了模式匹配在 switch 中的语法,使代码更加简洁易读。

代码示例:

  由于具体的语法变化可能会根据JDK的最终实现有所不同,这里提供一个概念性的示例:

record Point(int x, int y) {}  public class PatternMatchingDemo {  public static void main(String[] args) {  Point p = new Point(1, 2);  switch (p) {  case Point(int x, int y) -> System.out.println("Point: (" + x + ", " + y + ")");  // 其他可能的模式匹配情况...  default -> System.out.println("Unknown type");  }  }  
}

9.2 记录类(Record Class)的改进

  记录类在 JDK 16 中引入,旨在提供一种简洁、安全且易于理解的数据载体。
  在 JDK 18 中,记录类可能会有以下改进:

  更灵活的构造器:允许开发者定义更复杂的构造器逻辑,同时保持记录的简洁性。

  序列化支持:改进记录类的序列化机制,使其更容易与现有的数据处理库和框架集成。

  更好的模式匹配集成:让记录类与模式匹配更好地集成,简化数据结构的解构和处理。

代码示例(这里主要展示记录类的基本用法,因为具体的改进细节在 JDK 18 正式发布时可能会有所不同):

public record Person(String name, int age) {  // 默认构造器、getter、equals、hashCode 和 toString 等方法由编译器自动生成  // 可以在这里定义额外的方法或更复杂的构造器(如果 JDK 18 允许的话)  
}

9.3 默认UTF-8字符编码(JEP 400)

  JDK 18 将 UTF-8 设置为默认字符编码,使得在不加任何指定的情况下,所有需要用到编码的 JDK API 都默认使用 UTF-8 编码。

  这有助于避免因为不同系统、不同地区、不同环境之间产生的编码问题。

10. JDK19~21

  没有什么内容,全都是预览功能;比如:Record Pattern;虚拟线程;switch模式匹配(直到21才正式)。不过JDK21,最期待的应该是虚拟线程

  以上就是JDK的一些新特性介绍,希望这些信息能够帮助更好地理解和使用Java不同版本提供的新特性,为你带来更多的便利和效益。

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

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

相关文章

Educational Codeforces Round 166 (Rated for Div. 2)题解(A,B,D)

今天真的巨抽象&#xff0c;第三题没做出来&#xff0c;但是第四题过了&#xff0c;也是准备上小分了&#xff0c;因为nnd不按那个分数&#xff0c;而是按照做题数&#xff0c;直接废了 A. Verify Password 题解&#xff1a;小丑水题一个人&#xff0c;按照ASCII码比较一遍直接…

SDK开发

为什么需要Starter&#xff1f; 理想情况:开发者只需关心调用哪些接口&#xff0c;传递哪些参数就跟调用自己写的代码一样简单。 开发starter的好处&#xff1a;开发者引入之后&#xff0c;可以直接在application.yml中写配置&#xff0c;自动创建客户端。 starter开发流程 …

STM32G030C8T6:EEPROM读写实验(I2C通信)--M24C64

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;实现PB11,PB10 引脚模拟I2C 时序&#xff0c;对M24C08 的EEPRO…

javascript DOM 设置样式

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、直接…

2965. 找出缺失和重复的数字

2965. 找出缺失和重复的数字 题目链接&#xff1a;2965. 找出缺失和重复的数字 代码如下&#xff1a; class Solution { public:vector<int> findMissingAndRepeatedValues(vector<vector<int>>& grid) {vector<int> nums(grid.size()*grid.siz…

C语言| 求1到100之间奇数的平均值.

【分析思路】 第一种方法 直接遍历100个数字&#xff0c;用 i% 1来判断是不是奇数。 i 是奇数&#xff0c;每次相加&#xff0c;并计算个数。 最后直接求平均数average 1.0*sum / count; 第二种方法 设置变量i 1&#xff0c;每次加2&#xff0c;求奇数&#xff0c;并相加…

【易错题】数据统计补充习题(选择题 )#CDA Level 1

本文整理了数据统计相关的易错题&#xff0c;部分可作为备考CDA Level 1统计学部分的补充习题。来源&#xff1a;如荷学题库&#xff08;CFDP第三部分&#xff09; 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09; 6&#xff09; 7&#xff09; 8&…

shopee签名x-sap-ri、x-sap-sec算法还原

最新版签名&#xff0c;免账号登录成功率百分百&#xff0c;需要可d 两种方式base64 MTQzMDY0OTc3OA QXVndXN0MjItZnF4

【项目经理】什么是领导

引言&#xff1a;        项目管理是一个不断发展的领域&#xff0c;它要求项目经理不断学习、适应和创新。通过本系列文章&#xff0c;我们希望能够帮助每一位项目经理提升自己的专业能力&#xff0c;成为引领项目成功的舵手。 持续更新。。。。。。。。。。。。。。。…

第十三章 创建Web客户端 - 用于控制类生成和编译的 SOAP 向导选项

文章目录 第十三章 创建Web客户端 - 用于控制类生成和编译的 SOAP 向导选项用于控制类生成和编译的 SOAP 向导选项为 Web 服务创建客户端创建网络服务编译生成的类Class Type将 %OnDelete 方法添加到类中以便级联删除Proxy Class PackageCreate Business Operation 第十三章 创…

Blueprints - Collision Presets相关

一些以前的学习笔记归档&#xff1b; 在Static Mesh或SkeletalMesh等的属性中&#xff0c;都有Collision Presets&#xff1a; 其中Oject Type只是一个枚举参数&#xff0c;代表设置该Actor为什么类型&#xff0c;Collision Responses代表该Actor对各种类型的Actor有什么反应&a…

DataGrip 数据库连接客户端

I DataGrip 安装 1.1安装 打开dmg镜像&#xff0c;将“DataGrip.app”拖入应用程序中&#xff1b; 1.2 Act 打开应用程序,点击试用模式启动软件&#xff0c;然后将“jetbrains-agent-latest”拖到任意位置&#xff0c;然后拖入&#xff0c;弹出对话框&#xff0c;点击“Rest…

Java web应用性能分析之【压测工具ab】

常用的性能测试工具有&#xff1a;JMeter、loadRunner、ab&#xff1b;对于开发人员来说用的多的是免费的Jmeter和ab&#xff0c;对于测试来说可能用收费的商业软件loadRunner多。在这里我们就说说ab压测工具&#xff0c;因为ab基本满足web接口测试要求&#xff0c;jmeter后面再…

LabVIEW车体静强度试验台测控系统

LabVIEW车体静强度试验台测控系统 开发了一种基于LabVIEW的车体静强度试验台测控系统&#xff0c;通过自动化技术提高试验的精度和效率。系统采用LabVIEW软件与S7-200 SMART PLC硬件平台相结合&#xff0c;实现了对液压缸作用力的精确控制和试验数据的实时采集及管理。 传统的…

PyTorch 的 torch.nn 模块学习

torch.nn 是 PyTorch 中专门用于构建和训练神经网络的模块。它的整体架构分为几个主要部分&#xff0c;每部分的原理、要点和使用场景如下&#xff1a; 1. nn.Module 原理和要点&#xff1a;nn.Module 是所有神经网络组件的基类。任何神经网络模型都应该继承 nn.Module&#…

compare_exchange 基本使用

参考博客&#xff1a;C内存模型 compare_exchange_weak基本使用 bool compare_exchange_weak( T& expected, T desired,std::memory_order success,std::memory_order failure );expected:期望的值desired 想要写入的值 如果obj和期望的值相同&#xff0c;则写入desired并…

如何培养技术人员的管理能力?

随着企业发展的需求不断增长&#xff0c;对于一专多能的复合型人才的需求也日益增加。这种人才既拥有技术实力&#xff0c;又具备出色的管理能力。尤其对于高新技术企业而言&#xff0c;技术骨干往往更有机会成为管理人员。一方面是因为技术骨干在自己的岗位上展现出了核心技术…

「C系列」C 简介

文章目录 一、C 简介1. C语言的主要特点&#xff1a;2. C语言的应用领域&#xff1a;3. 学习C语言的建议&#xff1a; 二、C 环境设置、编辑器1. C环境设置2. 编辑器选择3. 总结 三、C第一个案例四、相关链接 一、C 简介 C语言是一种通用的、过程式的计算机编程语言&#xff0…

通用代码生成器应用场景四,跨编程语言翻译

通用代码生成器应用场景四&#xff0c;跨编程语言翻译 如果您有一个Java工程&#xff0c;想把它移植到Rust或Golang语言中去&#xff0c;希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的&#xff0c;保留了系统的SGS源文件或者SGS2的Excel模板&#xff0c;您可…

探索未来电商视觉革命:Doly,AI驱动的3D产品宣传短片一键生成器

在数字化营销日新月异的今天,产品展示的视觉冲击力已成为电商平台吸引消费者的关键。Doly,由法国创新先驱AniML匠心打造,正引领一场AI与3D技术融合的电商内容创新风暴,让每一位电商卖家都能轻松拥有好莱坞级别的产品宣传短片,只需简单几步,即可在激烈的市场竞争中脱颖而出…