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不同版本提供的新特性,为你带来更多的便利和效益。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值