Appearance
Java 版本发展史与特性详解
概述
Java 自 1995 年发布以来,经历了多个重要版本的迭代,每个版本都带来了新的特性、性能改进和语言增强。本文将详细介绍 Java 从 JDK 1.0 到最新版本的发展历程,重点分析每个版本的核心特性和功能改进。
版本发布策略
传统发布模式(1995-2017)
- 发布周期:不定期,通常 2-3 年一个大版本
- 特点:功能丰富,变化较大
- LTS 概念:尚未引入
现代发布模式(2017-至今)
- 发布周期:每 6 个月一个版本(3月和9月)
- LTS 版本:每 3 年一个长期支持版本
- 特点:小步快跑,持续改进
Java 版本详细介绍
JDK 1.0 (1996年1月)
代号:Oak
核心特性
- Java 虚拟机(JVM):跨平台运行环境
- 垃圾回收:自动内存管理
- 多线程支持:内置线程模型
- 安全模型:沙箱安全机制
- 网络编程:Socket 和 URL 类
JDK 1.1 (1997年2月)
主要新特性
- 内部类(Inner Classes):支持嵌套类定义
- JavaBeans:组件化编程模型
- JDBC:数据库连接标准
- RMI:远程方法调用
- 反射(Reflection):运行时类型信息
- JIT 编译器:即时编译优化
代码示例
java
// 内部类示例
public class OuterClass {
private int value = 10;
class InnerClass {
void display() {
System.out.println("Value: " + value);
}
}
}
J2SE 1.2 (1998年12月)
代号:Playground
重大改进
- Swing GUI:丰富的图形用户界面
- 集合框架(Collections Framework):统一的数据结构
- JIT 编译器改进:HotSpot JVM
- 安全策略:细粒度权限控制
- Java 2D API:2D 图形处理
集合框架示例
java
// 集合框架使用
import java.util.*;
public class CollectionExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Collections");
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1998);
}
}
J2SE 1.3 (2000年5月)
代号:Kestrel
主要特性
- HotSpot JVM:性能大幅提升
- Java Sound API:音频处理
- JNDI:命名和目录服务
- Java Platform Debugger Architecture (JPDA):调试架构
- RMI-IIOP:与 CORBA 集成
J2SE 1.4 (2002年2月)
代号:Merlin
重要新增
- 断言(Assertions):程序验证机制
- 正则表达式:模式匹配支持
- NIO(New I/O):非阻塞 I/O
- 日志 API:java.util.logging
- XML 处理:JAXP
- 首选项 API:java.util.prefs
代码示例
java
// 断言示例
public class AssertionExample {
public static void main(String[] args) {
int value = 10;
assert value > 0 : "Value must be positive";
// 正则表达式
String pattern = "\\d+";
String text = "123";
boolean matches = text.matches(pattern);
}
}
J2SE 5.0 (2004年9月)
代号:Tiger
革命性特性
- 泛型(Generics):类型安全的集合
- 增强的 for 循环:foreach 语法
- 自动装箱/拆箱:基本类型与包装类转换
- 枚举(Enums):类型安全的常量
- 可变参数(Varargs):方法参数数量可变
- 注解(Annotations):元数据支持
- 并发工具:java.util.concurrent
代码示例
java
// 泛型和增强 for 循环
public class Java5Features {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Generics");
// 增强 for 循环
for (String item : list) {
System.out.println(item);
}
// 枚举
enum Day { MONDAY, TUESDAY, WEDNESDAY }
Day today = Day.MONDAY;
// 可变参数
printNumbers(1, 2, 3, 4, 5);
}
public static void printNumbers(int... numbers) {
for (int num : numbers) {
System.out.println(num);
}
}
}
Java SE 6 (2006年12月)
代号:Mustang
主要改进
- 脚本引擎支持:javax.script
- 编译器 API:javax.tools
- HTTP 服务器 API:com.sun.net.httpserver
- JDBC 4.0:数据库连接改进
- JAX-WS 2.0:Web 服务支持
- 性能优化:启动速度和内存使用
Java SE 7 (2011年7月)
代号:Dolphin
重要特性
- Diamond 操作符:类型推断简化
- 字符串 switch 语句:字符串作为 switch 条件
- try-with-resources:自动资源管理
- 多异常捕获:单个 catch 块处理多种异常
- 数值字面量改进:二进制字面量和下划线分隔
- NIO.2:文件系统 API
- Fork/Join 框架:并行计算支持
代码示例
java
// Java 7 新特性
public class Java7Features {
public static void main(String[] args) {
// Diamond 操作符
List<String> list = new ArrayList<>();
// 字符串 switch
String day = "MONDAY";
switch (day) {
case "MONDAY":
System.out.println("Start of work week");
break;
case "FRIDAY":
System.out.println("TGIF!");
break;
}
// try-with-resources
try (FileReader fr = new FileReader("file.txt");
BufferedReader br = new BufferedReader(fr)) {
String line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
// 多异常捕获
try {
// some code
} catch (IOException | SQLException e) {
e.printStackTrace();
}
// 数值字面量
int binary = 0b1010;
int million = 1_000_000;
}
}
Java SE 8 (2014年3月) - LTS
代号:Spider
里程碑特性
- Lambda 表达式:函数式编程支持
- Stream API:集合的函数式操作
- 方法引用:简化 Lambda 表达式
- 默认方法:接口中的默认实现
- Optional 类:空值处理
- 新的日期时间 API:java.time
- Nashorn JavaScript 引擎:替代 Rhino
- 并行数组操作:Arrays.parallelSort
代码示例
java
// Java 8 函数式编程
import java.util.stream.*;
import java.time.*;
public class Java8Features {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Lambda 表达式和 Stream API
names.stream()
.filter(name -> name.length() > 3)
.map(String::toUpperCase)
.forEach(System.out::println);
// Optional
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(System.out::println);
// 新的日期时间 API
LocalDateTime now = LocalDateTime.now();
LocalDate date = LocalDate.of(2024, Month.JANUARY, 1);
// 默认方法
interface Drawable {
void draw();
default void print() {
System.out.println("Printing...");
}
}
}
}
Java SE 9 (2017年9月)
重大变革
- 模块系统(Project Jigsaw):JPMS
- JShell:交互式编程环境
- 改进的 Stream API:新的方法
- 私有接口方法:接口中的私有方法
- 多版本 JAR 文件:Multi-Release JAR
- 进程 API 改进:ProcessHandle
- 响应式流:Flow API
模块系统示例
java
// module-info.java
module com.example.myapp {
requires java.base;
requires java.logging;
exports com.example.myapp.api;
}
Java SE 10 (2018年3月)
主要特性
- 局部变量类型推断:var 关键字
- 应用程序类数据共享:AppCDS
- 垃圾回收器改进:G1 并行 Full GC
- 根证书:CA 证书集合
- 线程本地握手:Thread-Local Handshakes
代码示例
java
// var 关键字
public class Java10Features {
public static void main(String[] args) {
var list = new ArrayList<String>();
var map = new HashMap<String, Integer>();
var stream = list.stream();
for (var item : list) {
System.out.println(item);
}
}
}
Java SE 11 (2018年9月) - LTS
重要更新
- HTTP 客户端 API:标准化 HTTP/2 支持
- 字符串方法增强:isBlank(), lines(), strip()
- 文件读写简化:Files.readString(), writeString()
- Lambda 参数的 var:类型推断增强
- Epsilon GC:无操作垃圾回收器
- ZGC:实验性低延迟垃圾回收器
- 移除 JavaFX:独立发布
代码示例
java
// Java 11 新特性
import java.net.http.*;
import java.nio.file.*;
public class Java11Features {
public static void main(String[] args) throws Exception {
// HTTP 客户端
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com"))
.build();
// 字符串新方法
String text = " Hello World ";
System.out.println(text.isBlank());
System.out.println(text.strip());
// 文件操作
String content = Files.readString(Paths.get("file.txt"));
Files.writeString(Paths.get("output.txt"), "Hello");
// Lambda 中的 var
var list = List.of("a", "b", "c");
list.forEach((var item) -> System.out.println(item));
}
}
Java SE 12 (2019年3月)
新特性
- Switch 表达式:预览特性
- Shenandoah GC:实验性低暂停垃圾回收器
- 微基准测试套件:JMH 集成
- JVM 常量 API:动态常量支持
Java SE 13 (2019年9月)
主要改进
- 文本块:多行字符串(预览)
- Switch 表达式改进:yield 关键字
- ZGC 改进:内存释放优化
- Socket API 重新实现:NioSocketImpl
代码示例
java
// Java 13 文本块(预览)
public class Java13Features {
public static void main(String[] args) {
// 文本块
String json = """
{
"name": "John",
"age": 30,
"city": "New York"
}
""";
// Switch 表达式
int dayNumber = 1;
String dayType = switch (dayNumber) {
case 1, 2, 3, 4, 5 -> {
yield "Weekday";
}
case 6, 7 -> "Weekend";
default -> "Invalid";
};
}
}
Java SE 14 (2020年3月)
重要特性
- Switch 表达式:标准特性
- 模式匹配 instanceof:预览特性
- Records:数据类(预览)
- 文本块:标准特性
- 有用的 NullPointerException:详细错误信息
- NUMA 感知的 G1:性能优化
代码示例
java
// Java 14 Records(预览)
public record Person(String name, int age) {
// 自动生成构造器、getter、equals、hashCode、toString
}
public class Java14Features {
public static void main(String[] args) {
// 模式匹配 instanceof(预览)
Object obj = "Hello";
if (obj instanceof String str) {
System.out.println(str.toUpperCase());
}
// Records 使用
Person person = new Person("Alice", 30);
System.out.println(person.name());
System.out.println(person.age());
}
}
Java SE 15 (2020年9月)
新增特性
- 密封类:sealed classes(预览)
- 隐藏类:Hidden Classes
- EdDSA 签名算法:Edwards-Curve 数字签名
- ZGC 和 Shenandoah:生产就绪
- 文本块:最终版本
- Records:第二次预览
Java SE 16 (2021年3月)
主要更新
- Records:标准特性
- 模式匹配 instanceof:标准特性
- 密封类:第二次预览
- Vector API:孵化器特性
- 外部内存访问 API:孵化器特性
- 启用 C++14 语言特性:JVM 开发
Java SE 17 (2021年9月) - LTS
重要里程碑
- 密封类:标准特性
- 模式匹配增强:switch 的模式匹配(预览)
- 移除实验性 AOT 和 JIT 编译器:简化 JVM
- 强封装 JDK 内部 API:安全性提升
- 新的 macOS 渲染管道:Metal 支持
- 外部函数和内存 API:孵化器特性
代码示例
java
// Java 17 密封类
public sealed class Shape
permits Circle, Rectangle, Triangle {
}
public final class Circle extends Shape {
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
}
public final class Rectangle extends Shape {
private final double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
}
Java SE 18 (2022年3月)
新特性
- UTF-8 默认字符集:平台无关的默认编码
- 简单 Web 服务器:jwebserver 命令
- 代码片段 Javadoc 标签:@snippet
- Vector API:第三次孵化
- 外部函数和内存 API:第二次孵化
- 模式匹配 switch:第二次预览
Java SE 19 (2022年9月)
主要改进
- 虚拟线程:Project Loom(预览)
- 结构化并发:孵化器特性
- 模式匹配 switch:第三次预览
- 外部函数和内存 API:预览特性
- Vector API:第四次孵化
虚拟线程示例
java
// Java 19 虚拟线程(预览)
import java.util.concurrent.Executors;
public class Java19Features {
public static void main(String[] args) {
// 虚拟线程
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 1000; i++) {
int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " running on " +
Thread.currentThread());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
}
}
}
Java SE 20 (2023年3月)
新增功能
- Scoped Values:孵化器特性
- Record 模式:第二次预览
- 模式匹配 switch:第四次预览
- 外部函数和内存 API:第二次预览
- 虚拟线程:第二次预览
- 结构化并发:第二次孵化
Java SE 21 (2023年9月) - LTS
重要特性
- 虚拟线程:标准特性
- Sequenced Collections:有序集合接口
- 模式匹配 switch:标准特性
- Record 模式:标准特性
- 字符串模板:预览特性
- 未命名模式和变量:预览特性
- KEM API:密钥封装机制
代码示例
java
// Java 21 新特性
import java.util.*;
public class Java21Features {
public static void main(String[] args) {
// Sequenced Collections
SequencedSet<String> set = new LinkedHashSet<>();
set.add("first");
set.add("second");
String first = set.getFirst();
String last = set.getLast();
// 模式匹配 switch
Object obj = "Hello";
String result = switch (obj) {
case String s when s.length() > 5 -> "Long string: " + s;
case String s -> "Short string: " + s;
case Integer i -> "Number: " + i;
case null -> "Null value";
default -> "Unknown type";
};
// Record 模式
record Point(int x, int y) {}
Point point = new Point(1, 2);
switch (point) {
case Point(var x, var y) when x == y ->
System.out.println("Point on diagonal");
case Point(var x, var y) ->
System.out.println("Point at (" + x + ", " + y + ")");
}
}
}
Java SE 22 (2024年3月)
最新特性
- 未命名变量和模式:标准特性
- 字符串模板:第二次预览
- 隐式声明的类和实例 main 方法:预览特性
- 外部函数和内存 API:标准特性
- 多源文件程序:预览特性
- 结构化并发:第三次孵化
- Scoped Values:第二次孵化
- Vector API:第七次孵化
Java SE 23 (2024年9月)
新增功能
- 原始类型模式:预览特性
- 模块导入声明:预览特性
- 隐式声明的类和实例 main 方法:第二次预览
- 字符串模板:第三次预览
- ZGC 分代模式:标准特性
- 结构化并发:第四次孵化
版本选择建议
LTS 版本推荐
- Java 8:广泛使用,生态成熟
- Java 11:现代 Java 的起点
- Java 17:当前主流选择
- Java 21:最新 LTS,推荐新项目使用
版本迁移路径
Java 8 → Java 11 → Java 17 → Java 21
企业级应用建议
- 新项目:Java 21 LTS
- 维护项目:Java 17 LTS
- 遗留系统:Java 11 LTS(最低要求)
性能对比
启动时间改进
- Java 8: 基准
- Java 11: 10-15% 改进
- Java 17: 20-25% 改进
- Java 21: 30-35% 改进
内存使用优化
- 压缩 OOP:减少内存占用
- 字符串去重:G1GC 特性
- 类数据共享:减少启动内存
垃圾回收器演进
Serial → Parallel → CMS → G1 → ZGC/Shenandoah
未来发展趋势
Project Loom
- 虚拟线程:轻量级并发
- 结构化并发:并发编程简化
- Continuation:协程支持
Project Panama
- 外部函数接口:本地代码调用
- 外部内存访问:直接内存操作
- Vector API:SIMD 指令支持
Project Valhalla
- 值类型:内存布局优化
- 泛型特化:性能提升
- 原始类型泛型:类型系统增强
Project Amber
- 模式匹配:函数式编程增强
- 数据类:简化数据建模
- 字符串模板:安全的字符串插值
学习建议
基础学习路径
- Java 8:Lambda、Stream、Optional
- Java 11:模块系统、HTTP 客户端
- Java 17:Records、密封类、模式匹配
- Java 21:虚拟线程、结构化并发
实践项目建议
- Web 应用:Spring Boot + Java 21
- 微服务:Spring Cloud + Java 17
- 大数据:Kafka + Java 11
- 云原生:GraalVM + Java 21
总结
Java 经过近 30 年的发展,从简单的面向对象语言演进为现代化的多范式编程平台。每个版本都在性能、安全性、开发效率和语言表达力方面带来显著改进。
关键里程碑
- Java 5:泛型和注解,现代 Java 基础
- Java 8:Lambda 和 Stream,函数式编程
- Java 9:模块系统,大型应用架构
- Java 17:现代语法特性完善
- Java 21:虚拟线程,并发编程革命
发展方向
- 性能优化:启动速度、内存使用、执行效率
- 开发体验:语法简化、类型推断、模式匹配
- 并发编程:虚拟线程、结构化并发
- 互操作性:外部函数接口、本地代码集成
- 云原生:容器化、微服务、响应式编程
Java 将继续在企业级应用开发中发挥重要作用,同时不断适应现代软件开发的需求和挑战。