JDK11新特性【附源码】

JDK 11(Java SE 11)是继 JDK 8 之后的第二个长期支持(LTS)版本,在 JDK 9/10 的基础上进一步完善了功能,引入了多项实用特性,提升了开发效率和性能。以下是 JDK 11 的主要新特性及重要特性的代码示例:

一、主要新特性列表

  1. 局部变量类型推断增强(var在 Lambda 参数中的使用):允许在 Lambda 表达式中使用var声明参数,支持注解
  2. 字符串增强:新增isBlank()lines()strip()stripLeading()stripTrailing()repeat(n)等方法
  3. 集合增强Collection接口新增toArray(IntFunction<T[]>)重载方法,简化数组转换
  4. HTTP 客户端标准化(java.net.http):将 JDK 9 引入的 HttpClient 从孵化阶段正式纳入标准库,支持同步 / 异步 HTTP 请求
  5. Optional 增强:新增isEmpty()方法,判断值是否为空
  6. File API 增强Files类新增readString()writeString()方法,简化文件读写
  7. 单文件源代码程序运行:无需先编译,直接通过java命令运行.java文件
  8. ZGC 垃圾收集器:引入低延迟垃圾收集器(实验性,JDK 15 后转正),支持 TB 级内存,暂停时间不超过 10ms
  9. Epsilon 垃圾收集器:“无操作” 垃圾收集器,仅分配内存不回收,用于性能测试
  10. 飞行记录器(Flight Recorder):从商业功能变为免费功能,用于诊断和分析 Java 应用运行时信息
  11. 移除废弃功能:移除com.sun.awt.AWTUtilitiessun.misc.Unsafe.defineClass等废弃 API,以及 Java EE 和 CORBA 模块

二、重要特性及代码示例

1. 局部变量类型推断增强(var在 Lambda 参数中的使用)

JDK 10 引入var用于局部变量类型推断(如var list = new ArrayList<String>()),JDK 11 进一步允许在 Lambda 表达式中使用var声明参数,同时支持对参数添加注解,解决了 Lambda 参数无法直接注解的问题。

示例:Lambda 参数使用var及注解

import java.util.Arrays;
import java.util.List;

public class VarLambdaExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        
        // JDK 11前:Lambda参数需显式声明类型(如需注解,需加类型)
        names.forEach((String s) -> System.out.println(s));
        
        // JDK 11:使用var声明Lambda参数(更灵活)
        names.forEach((var s) -> System.out.println(s));
        
        // 支持参数注解(结合var)
        names.forEach((@Deprecated var s) -> System.out.println(s));
    }
}
2. 字符串增强方法

JDK 11 为String类新增了多个实用方法,简化字符串处理(如空白判断、多行处理、修剪、重复等)。

示例:字符串新方法

public class StringEnhanceExample {
    public static void main(String[] args) {
        // 1. isBlank():判断字符串是否为空白(仅空格、制表符等,无实际字符)
        String blankStr = "   \t\n";
        System.out.println(blankStr.isBlank()); // 输出:true(空白)
        System.out.println(" a ".isBlank());    // 输出:false(含非空白字符)
        
        // 2. lines():将字符串按行分割为Stream
        String multiLine = "Hello\nWorld\nJava 11";
        multiLine.lines().forEach(line -> System.out.println("Line: " + line));
        // 输出:
        // Line: Hello
        // Line: World
        // Line: Java 11
        
        // 3. strip():去除前后空白(类似trim(),但支持Unicode空白字符)
        String strWithSpaces = "  \u2002test\u2002  "; // \u2002是Unicode空格
        System.out.println("[" + strWithSpaces.trim() + "]");    // 输出:[  test  ](trim()无法处理Unicode空格)
        System.out.println("[" + strWithSpaces.strip() + "]");    // 输出:[test](strip()支持Unicode)
        
        // 4. repeat(n):重复字符串n次
        String repeated = "ab".repeat(3);
        System.out.println(repeated); // 输出:ababab
    }
}
3. HTTP 客户端标准化(java.net.http

JDK 11 将HttpClient从孵化模块(jdk.incubator.http)正式纳入标准库(java.net.http),支持 HTTP/1.1 和 HTTP/2,提供同步和异步请求方式,API 更简洁易用。

示例:使用 HttpClient 发送 HTTP 请求

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

public class HttpClientExample {
    public static void main(String[] args) throws Exception {
        // 创建HttpClient
        HttpClient client = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2) // 使用HTTP/2
                .connectTimeout(Duration.ofSeconds(10))
                .build();
        
        // 1. 发送同步GET请求
        HttpRequest getRequest = HttpRequest.newBuilder()
                .uri(URI.create("https://httpbin.org/get"))
                .GET()
                .build();
        
        HttpResponse<String> getResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString());
        System.out.println("同步GET响应状态:" + getResponse.statusCode());
        System.out.println("同步GET响应体:" + getResponse.body());
        
        // 2. 发送异步POST请求
        HttpRequest postRequest = HttpRequest.newBuilder()
                .uri(URI.create("https://httpbin.org/post"))
                .header("Content-Type", "text/plain")
                .POST(HttpRequest.BodyPublishers.ofString("Hello from Java 11 HttpClient"))
                .build();
        
        client.sendAsync(postRequest, HttpResponse.BodyHandlers.ofString())
              .thenApply(HttpResponse::body)
              .thenAccept(body -> System.out.println("异步POST响应体:" + body))
              .join(); // 等待异步操作完成
    }
}
4. File API 增强(readStringwriteString

JDK 11 为java.nio.file.Files类新增了readString(Path)writeString(Path, CharSequence)方法,无需手动处理输入流 / 输出流,直接读写文本文件。

示例:简化文件读写

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileEnhanceExample {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("test.txt");
        
        // 1. 写入字符串到文件
        String content = "Hello, JDK 11 Files API!";
        Files.writeString(path, content); // 自动处理编码(默认UTF-8)
        System.out.println("文件写入完成");
        
        // 2. 从文件读取字符串
        String readContent = Files.readString(path);
        System.out.println("文件内容:" + readContent); // 输出:Hello, JDK 11 Files API!
    }
}
5. Optional 增强(isEmpty()方法)

Optional类新增isEmpty()方法,用于判断值是否为空(与isPresent()相反),语义更清晰。

示例:Optional 的 isEmpty ()

import java.util.Optional;

public class OptionalEnhanceExample {
    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable(null);
        
        // JDK 11前:判断为空需用!isPresent()
        if (!optional.isPresent()) {
            System.out.println("值为空(旧方式)");
        }
        
        // JDK 11:使用isEmpty()直接判断
        if (optional.isEmpty()) {
            System.out.println("值为空(新方式)"); // 输出此句
        }
    }
}
6. 单文件源代码程序运行

JDK 11 允许直接通过java命令运行单个.java文件,无需先执行javac编译,简化了小型程序的运行流程。

示例:运行单文件程序创建Hello.java文件:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, JDK 11 Single File Execution!");
    }
}

直接运行(无需编译):

java Hello.java

输出:Hello, JDK 11 Single File Execution!

总结

JDK 11 作为 LTS 版本,在实用性和性能上都有显著提升:字符串和 File API 的增强简化了日常开发;HttpClient 的标准化提供了原生 HTTP 处理能力;var在 Lambda 中的使用提升了代码灵活性;ZGC 和 Epsilon 收集器则满足了不同场景的性能需求。这些特性使得 JDK 11 成为企业级应用的优选版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值