Java 11 新特性详细教程

Java 11 新特性详细教程

Java 11 是 Java 社区的一个重要版本,于 2018 年 9 月发布,作为 长期支持版本(LTS),继承了 Java 8 和 Java 9 的特性,同时新增了许多实用功能。Java 11 提供了生产环境级别的稳定性和现代化编程功能,是现代 Java 开发的首选之一。

本文将详细讲解 Java 11 的新特性、示例代码以及其实际应用场景,帮助读者全面掌握 Java 11。


目录

  1. 局部变量类型推断(增强版 var
  2. 字符串处理增强
  3. 新 HTTP Client API
  4. 运行 Java 文件的新方式
  5. 废弃和移除的特性
  6. 垃圾回收改进
  7. 新增强的 API
  8. 多版本 Jar 支持

1. 局部变量类型推断(增强版 var

1.1 什么是 var

var 是 Java 10 引入的局部变量类型推断关键字,允许编译器根据初始化表达式自动推断变量的类型。这一功能在 Java 11 中得到增强,支持在 Lambda 表达式的参数 中使用 var

1.2 Java 11 的改进

在 Java 11 中,Lambda 表达式的参数可以使用 var,从而支持附加注解(例如 @Nullable@NonNull 等)。

示例

import java.util.List;

public class VarExample {
    public static void main(String[] args) {
        // 使用 var 声明局部变量
        var list = List.of("Java", "Python", "C++");
        list.forEach(System.out::println);

        // 在 Lambda 参数中使用 var
        list.forEach((@Deprecated var language) -> System.out.println(language + " is awesome!"));
    }
}

输出:

Java
Python
C++
Java is awesome!
Python is awesome!
C++ is awesome!

注意事项

  1. var 只能用于局部变量,不能用于类级别的字段或方法参数。
  2. Lambda 参数中必须一致使用 var 或一致省略类型。

2. 字符串处理增强

Java 11 对 String 类进行了增强,添加了许多实用方法,简化了常见的字符串操作。

2.1 新增方法

  1. isBlank()

    • 判断字符串是否为空白字符串(包括空字符串和仅包含空白字符)。
    System.out.println("".isBlank());       // true
    System.out.println("  ".isBlank());    // true
    System.out.println("Java".isBlank());  // false
    
  2. lines()

    • 将多行字符串分割成 Stream
    var multiline = "Java 11\nis\nawesome!";
    multiline.lines().forEach(System.out::println);
    
  3. strip()

    • 去除字符串首尾的空白字符,比 trim() 更强大,支持 Unicode 空白字符。
    System.out.println("  hello  ".strip());       // "hello"
    System.out.println("  hello  ".stripLeading()); // "hello  "
    System.out.println("  hello  ".stripTrailing());// "  hello"
    
  4. repeat()

    • 重复字符串指定次数。
    System.out.println("Java".repeat(3)); // "JavaJavaJava"
    

3. 新 HTTP Client API

Java 11 为 HTTP 客户端提供了新的 API,替代了旧的 HttpURLConnection,更加现代化、易用、支持异步和 HTTP/2。

3.1 基本使用

发送同步 GET 请求:

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class HttpClientExample {
    public static void main(String[] args) throws Exception {
        // 创建 HttpClient
        var client = HttpClient.newHttpClient();

        // 创建 HttpRequest
        var request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.github.com"))
                .GET()
                .build();

        // 发送请求并接收响应
        var response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 打印响应
        System.out.println("Response code: " + response.statusCode());
        System.out.println("Response body: " + response.body());
    }
}

发送异步请求:

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

4. 运行 Java 文件的新方式

Java 11 支持直接运行 .java 文件,无需显式编译为 .class 文件。这简化了小程序或脚本的运行流程。

示例

文件:HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java 11!");
    }
}

直接运行:

java HelloWorld.java

输出:

Hello, Java 11!

5. 废弃和移除的特性

5.1 废弃特性

  1. Java EE 和 CORBA

    • Java 11 完全移除了 Java EE 和 CORBA 模块。
    • 替代方案:可以使用 Jakarta EE。
  2. Applets

    • Applets 已被废弃,现代浏览器不再支持。

5.2 java.se.ee 模块的移除

从 Java 11 开始,java.se.ee 模块被移除,涉及以下模块:

  • java.xml.ws
  • java.xml.bind
  • java.activation

6. 垃圾回收改进

6.1 ZGC(Z Garbage Collector)

  • 特点:超低延迟,GC 暂停时间通常小于 10 毫秒。

  • 适用场景:大内存、高并发应用。

  • 启用方式:

    java -XX:+UseZGC MyApp
    

6.2 Epsilon GC

  • 特点:无垃圾回收,仅用于测试性能或短命进程。

  • 启用方式:

    java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyApp
    

7. 新增强的 API

7.1 Files 类的新方法

  1. writeString()readString()
    简化了文件的读写操作。

    import java.nio.file.Files;
    import java.nio.file.Path;
    
    public class FileExample {
        public static void main(String[] args) throws Exception {
            var path = Path.of("example.txt");
    
            // 写入文件
            Files.writeString(path, "Hello, Java 11!");
    
            // 读取文件
            var content = Files.readString(path);
            System.out.println(content);
        }
    }
    

7.2 Optional 类增强

  1. isEmpty()
    判断 Optional 是否为空。

    var optional = Optional.empty();
    System.out.println(optional.isEmpty()); // true
    
  2. or()
    提供备用值。

    var optional = Optional.ofNullable(null);
    optional.or(() -> Optional.of("Default")).ifPresent(System.out::println);
    

8. 多版本 Jar 支持

Java 11 支持在一个 Jar 文件中针对不同的 Java 版本提供不同的实现。

目录结构

example.jar
  ├─ META-INF/
  │    ├─ versions/
  │    │    ├─ 9/
  │    │    ├─ 11/

通过此功能,开发者可以在一个 Jar 包中支持多版本的 JDK。

Java8 新特性
Java11 新特性
Java17 新特性
Java21 新特性

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愤怒的代码

如果您有受益,欢迎打赏博主😊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值