OpenJDK 17 和 JDK 1.8(即 Java 8)是 Java 的两个重要版本,二者发布时间相隔近 8 年(Java 8 发布于 2014 年,Java 17 发布于 2021 年),在语言特性、性能优化、API 支持、安全性等方面均有显著差异。以下是主要区别:
---
### **1. 语言特性**
#### **Java 8 (JDK 1.8)**
- **Lambda 表达式**:简化函数式编程。
```java
list.forEach(s -> System.out.println(s));
```
- **Stream API**:支持链式数据操作(如过滤、映射、归约)。
```java
List evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
```
- **默认方法(Default Methods)**:允许接口包含具体实现的方法。
- **方法引用**:简化 Lambda 表达式。
```java
list.forEach(System.out::println);
```
- **Optional 类**:避免空指针异常。
#### **Java 17 (OpenJDK 17)**
- **Sealed Classes(密封类)**:限制类的继承关系。
```java
public sealed class Shape permits Circle, Square, Rectangle { ... }
```
- **Pattern Matching(模式匹配)**:
- **`instanceof` 模式匹配**(Java 16):
```java
if (obj instanceof String s) {
System.out.println(s.length());
}
```
- **Switch 表达式模式匹配(预览功能)**:
```java
String result = switch (obj) {
case Integer i -> "整数: " + i;
case String s -> "字符串: " + s;
default -> "未知类型";
};
```
- **Text Blocks(文本块,Java 15 正式支持)**:简化多行字符串。
```java
String json = """
{
"name": "Java",
"version": 17
}
""";
```
- **Records(记录类,Java 16 正式支持)**:简化不可变数据类。
```java
public record Person(String name, int age) {}
```
---
### **2. API 更新**
#### **Java 17**
- **新的 HTTP Client(Java 11 引入)**:替代老旧的 `HttpURLConnection`,支持异步和非阻塞。
```java
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
```
- **增强的集合 API**:如 `List.of()`, `Set.copyOf()` 等工厂方法。
- **`NullPointerException` 的堆栈信息增强**:明确提示空指针的具体位置。
- **Unicode 支持升级**:支持到 Unicode 13.0。
- **新的日期时间 API 改进**(Java 8 引入,后续版本优化)。
#### **Java 8**
- **日期时间 API(`java.time`)**:引入 `LocalDate`、`LocalTime` 等类。
- **Nashorn JavaScript 引擎**(已从 Java 15 移除)。
---
### **3. 性能优化**
#### **Java 17**
- **ZGC(Z Garbage Collector)**:低延迟垃圾回收器(Java 11 引入,Java 15 成为正式功能)。
- **Shenandoah GC**:低停顿时间的垃圾回收器(Java 12 引入)。
- **性能提升**:JIT 编译器优化(如 GraalVM 的集成)、类数据共享(CDS)增强。
- **启动速度优化**:通过 AppCDS(Application Class-Data Sharing)减少启动时间。
#### **Java 8**
- **默认垃圾回收器**:Parallel GC(吞吐量优先)。
- **Metaspace 替代 PermGen**:减少内存溢出问题。
---
### **4. JVM 与工具改进**
#### **Java 17**
- **强封装 JDK 内部 API**:默认禁止反射访问内部 API(通过 `--add-opens` 手动开放)。
- **模块化系统(JPMS,Java 9 引入)**:通过 `module-info.java` 管理依赖。
- **动态 CDS 归档**:简化类数据共享的生成过程。
- **移除实验性 AOT 和 JIT 编译器**(如 Java 17 移除了 Jaotc)。
#### **Java 8**
- **无模块化系统**:依赖传统的 JAR 包和类路径。
- **支持 `jjs`(Nashorn 引擎)**:后续版本已移除。
---
### **5. 废弃和移除的功能**
#### **Java 17**
- **移除 Applet API**:浏览器插件支持已过时。
- **移除 Security Manager**(标记为废弃)。
- **移除 RMI Activation**:分布式计算的旧机制。
#### **Java 8**
- **未移除旧特性**:如 `javax.swing`、`java.awt` 等。
---
### **6. 许可证与支持**
- **Java 8**:Oracle 对 JDK 8 的免费商业支持已于 2019 年结束,需付费或使用 OpenJDK 分支(如 AdoptOpenJDK)。
- **Java 17**:OpenJDK 17 是免费的,且作为 LTS(长期支持版本)提供至少 8 年的支持。
---
### **总结:如何选择?**
- **用 Java 17**:需要新特性(如密封类、模式匹配)、更好的性能或长期支持。
- **用 Java 8**:维护旧项目,或依赖某些已废弃的库(如 Applet)。
如需升级,建议逐步迁移并参考 [Oracle 迁移指南](https://docs.oracle.com/en/java/javase/17/migrate/index.html)。