JDK11 相比 JDK8

181 阅读3分钟

JDK 11 是一个长期支持(LTS)版本,相比 JDK 8,引入了许多新特性和功能,涵盖语言特性、API 增强、性能优化和工具改进。以下是 JDK 11 相比 JDK 8 的主要新特性、使用代码示例以及使用它的好处。


JDK 11 相比 JDK 8 的主要新特性

1. var 关键字(JDK 10 引入)

  • 功能:允许在局部变量声明时使用 var 代替显式的类型声明,编译器会自动推断类型。
  • 好处:减少样板代码,提高代码可读性。

示例代码

public class VarExample {
    public static void main(String[] args) {
        var message = "Hello, JDK 11!";
        System.out.println(message);

        var numbers = List.of(1, 2, 3, 4);
        for (var number : numbers) {
            System.out.println(number);
        }
    }
}

JDK11 var 语法可读性分析

2. 新的 HTTP 客户端 API

  • 功能:提供了现代化的 HTTP 客户端,支持同步和异步请求,替代了旧的 HttpURLConnection
  • 好处:更易用,支持 HTTP/2 和 WebSocket。

JDK11 HTTP 客户端

3. 字符串增强

  • 功能:新增了一些实用的字符串方法,如 isBlank()lines()strip() 等。
  • 好处:简化字符串操作,提高代码可读性。

示例代码

public class StringEnhancements {
    public static void main(String[] args) {
        String str = "   Hello, JDK 11!   ";
        System.out.println(str.isBlank()); // false
        System.out.println(str.strip());   // "Hello, JDK 11!"
        System.out.println(str.lines().count()); // 1
    }
}

4. 集合工厂方法(JDK 9 引入)

  • 功能List.of()Set.of() 和 Map.of() 方法用于创建不可变集合。
  • 好处:减少样板代码,避免手动创建集合。

示例代码

import java.util.List;
import java.util.Map;
import java.util.Set;

public class CollectionFactoryMethods {
    public static void main(String[] args) {
        List<String> list = List.of("A", "B", "C");
        Set<String> set = Set.of("X", "Y", "Z");
        Map<String, Integer> map = Map.of("Key1", 1, "Key2", 2);

        System.out.println(list);
        System.out.println(set);
        System.out.println(map);
    }
}

5. Files API 增强

  • 功能:新增 readString() 和 writeString() 方法,简化文件读写操作。
  • 好处:更直观的文件操作,减少代码量。

示例代码

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

public class FilesApiExample {
    public static void main(String[] args) throws Exception {
        Path path = Files.writeString(Files.createTempFile("test", ".txt"), "Hello, JDK 11!");
        String content = Files.readString(path);
        System.out.println(content);
    }
}

6. Lambda 表达式中的 var(JDK 11 引入)

  • 功能:允许在 Lambda 表达式的参数中使用 var
  • 好处:支持添加注解,同时保持类型推断的灵活性。

示例代码

import java.util.List;

public class LambdaVarExample {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie");
        names.forEach((var name) -> System.out.println(name.toUpperCase()));
    }
}

7. ZGC(Z Garbage Collector)

  • 功能:引入了低延迟垃圾回收器 ZGC。
  • 好处:适合对延迟敏感的应用程序,最大暂停时间通常低于 10 毫秒。

启用 ZGC

java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx2G MyApp

8. 移除和弃用

  • 移除了 Java EE 和 CORBA 模块。
  • 弃用了 Nashorn JavaScript 引擎。

JDK 11 的好处

  1. 提高开发效率

    • 新的语言特性(如 var 和字符串增强)减少了样板代码,提高了代码可读性和开发效率。
  2. 现代化工具支持

    • 新的 HTTP 客户端 API 和增强的 Files API 提供了更直观的编程接口。
  3. 性能优化

    • 引入了 ZGC 和其他 JVM 改进,提升了运行时性能,特别是在延迟敏感的应用中。
  4. 安全性增强

    • 修复了 JDK 8 中的已知漏洞,并引入了更强的安全机制。
  5. 长期支持(LTS)

    • JDK 11 是一个长期支持版本,适合在生产环境中使用。

总结

JDK 11 相比 JDK 8 引入了许多现代化的特性和工具,以下是主要对比:

特性/版本JDK 8JDK 11
var不支持支持
HTTP 客户端 API旧的 HttpURLConnection新的 HTTP 客户端 API
字符串增强不支持支持(如 isBlank()strip()
集合工厂方法不支持支持(如 List.of()
文件读写增强不支持支持(如 readString()
Lambda 中的 var不支持支持
ZGC不支持支持