| **年份 | 版本 | 新特性** |
|---|---|---|
| 1995 | Java 1.0 | 初始版本,包含核心 API 和 Java 虚拟机 |
| 1996 | Java 1.1 | 新增内部类、反射、JAR 文件等 |
| 1998 | Java 1.2 | 新增 Java 2D API、JDBC 数据库连接 API 和 JNDI 命名服务 |
| 2000 | Java 1.3 | 新增 HotSpot 虚拟机、RMI 远程方法调用和 JMX 管理 API |
| 2002 | Java 1.4 | 新增正则表达式、NIO 非阻塞 I/O 和 JMX 2.0 |
| 2004 | Java 1.5 | 新增泛型、自动装箱/拆箱和枚举类型 |
| 2006 | Java 1.6 | 新增注解、元数据和 Java SE 6 集合框架 |
| 2010 | Java 1.7 | 新增 NIO.2、改进的 Fork/Join 并发框架和 invokedynamic 指令 |
| 2014 | Java 1.8 | 新增 Lambda 表达式、方法引用、Nashorn JavaScript 引擎和 Stream API |
| 2017 | Java 1.9 | 新增模块化、Jigsaw 项目、Reactive Streams API 和 HttpClient API |
| 2018 | Java 10 | 新增 Local-Variable Type Inference、var 关键字、G1 收集器改进和 Application Class-Data Sharing |
| 2019 | Java 11 | 新增新的垃圾收集器: Epsilon GC 和 ZGC、局部变量类型推断增强、Flight Recorder、Dynamic CDS 和 GraalVM Native Image |
| 2020 | Java 14 | 新增 Records、Pattern Matching、文本块: 第二版和弃用 Finalization |
| 2021 | Java 17 | 新增 Sealed Classes、Switch Expressions (Incubating)、模式匹配 for instanceof (Incubating)和迁移到 UTF-8 默认值 |
| 2022 | Java 18 | 新增 文本块: 第三版、记录 with Foreign Keys、UTF-8 默认值、JEP 429: 值对象 (Preview) 和 JEP 430: Loom (Preview) |
| 2023 | Java 19 | 新增 Loom 项目: 虚拟线程、向量 API: SIMD 加速、模式匹配 for switch 和记录类: 不可变数据类型 |
Java 各版本新特性、代码示例和具体的使用案例
Java 8:
新特性:
- Lambda 表达式
- 方法引用
- Optional 类
- Nashorn JavaScript 引擎
- Stream API
代码示例:
- Lambda 表达式:
Java
(x, y) -> x + y
- 方法引用:
Java
System.out.println("Hello, world!");
- Optional 类:
Java
Optional<String> name = Optional.ofNullable("John Doe");
- Nashorn JavaScript 引擎:
Java
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hello, world!')");
- Stream API:
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().sum();
具体的使用案例:
- Lambda 表达式: 可以用来替换匿名内部类,简化集合操作,编写流 API 代码。
- 方法引用: 可以用来代替 Lambda 表达式,使代码更加简洁易读。
- Optional 类: 可以用来处理可能为 null 的值,避免空指针异常。
- Nashorn JavaScript 引擎: 可以用来在 Java 代码中执行 JavaScript 代码。
- Stream API: 可以用来对集合进行操作,简化代码。
Java 9:
新特性:
- 模块化
- Jigsaw 项目
- Reactive Streams API
- HttpClient API
代码示例:
- 模块化:
Java
module com.example.myapp {
requires java.base;
exports com.example.myapp.api;
}
- Jigsaw 项目:
Java
jdk.attach("pid");
- Reactive Streams API:
Java
Publisher<String> publisher = ...;
Subscriber<String> subscriber = ...;
publisher.subscribe(subscriber);
- HttpClient API:
Java
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com/"))
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
具体的使用案例:
- 模块化: 可以用来将 Java 代码组织成模块,提高代码的可维护性和可扩展性。
- Jigsaw 项目: 可以用来调试和分析 Java 应用程序。
- Reactive Streams API: 可以用来编写异步非阻塞的应用程序。
- HttpClient API: 可以用来发送 HTTP 请求和接收 HTTP 响应。
Java 10:
新特性:
- 局部变量类型推断
- var 关键字
- G1 收集器改进
- Application Class-Data Sharing
代码示例:
- 局部变量类型推断:
var name = "John Doe";
- var 关键字:
var numbers = Arrays.asList(1, 2, 3, 4, 5);
- G1 收集器改进:
-XX:+UseG1GC
- Application Class-Data Sharing:
-XX:+UseAppCDS
具体的使用案例:
- 局部变量类型推断: 可以简化代码,提高代码的可读性。
- var 关键字: 可以用来声明局部变量,无需指定类型。
- G1 收集器改进: 可以提高 Java 应用程序的性能。
- Application Class-Data Sharing: 可以提高 Java 应用程序的启动速度。
Java 11:
新特性:
- 新的垃圾收集器: Epsilon GC 和 ZGC
- 局部变量类型推断增强
- Flight Recorder
- Dynamic CDS
- GraalVM Native Image
代码示例:
- 新的垃圾收集器: Epsilon GC 和 ZGC:
-XX:+UseEpsilonGC
-XX:+UseZGC
- 局部变量类型推断增强:
var numbers = Arrays.asList(1, 2, 3, 4, 5);
var sum = numbers.stream().sum();
- Flight Recorder:
jcmd <pid> FlightRecorder start
jcmd <pid> FlightRecorder stop
jcmd <pid> FlightRecorder dump
- Dynamic CDS:
-XX:+UseDynamicCDS
- GraalVM Native Image:
Java 14:
新特性:
- Records
- Pattern Matching
- 文本块: 第二版
代码示例:
- Records:
record Person(String name, int age) {
// ...
}
- Pattern Matching:
switch (obj) {
case String s:
System.out.println("String: " + s);
break;
case Integer i:
System.out.println("Integer: " + i);
break;
default:
System.out.println("Unknown type: " + obj.getClass().getName());
}
- 文本块: 第二版:
String text = """
This is a multiline
string literal.
""";
具体的使用案例:
- Records: 可以用来创建不可变的数据类型,提高代码的安全性和可维护性。
- Pattern Matching: 可以用来简化代码,提高代码的可读性。
- 文本块: 第二版: 可以用来编写多行字符串,简化代码。
Java 17:
新特性:
- Sealed Classes
- Switch Expressions (Incubating)
- 模式匹配 for instanceof (Incubating)
代码示例:
- Sealed Classes:
sealed class Animal permits Dog, Cat {
// ...
}
- Switch Expressions (Incubating):
int result = switch (x) {
case 1:
yield 10;
case 2:
yield 20;
default:
yield 0;
};
- 模式匹配 for instanceof (Incubating):
if (obj instanceof String s) {
System.out.println("String: " + s);
} else if (obj instanceof Integer i) {
System.out.println("Integer: " + i);
} else {
System.out.println("Unknown type: " + obj.getClass().getName());
}
具体的使用案例:
- Sealed Classes: 可以用来表示有限数量的类型,提高代码的安全性和可维护性。
- Switch Expressions (Incubating): 可以用来代替传统
Java 18:
新特性:
- 文本块: 第三版
- Unicode 15.0 支持
- JShell 增强
- 其他改进
代码示例:
- 文本块: 第三版:
String text = """
This is a multiline
string literal with
interpolation.
""";
System.out.println(text.formatted("%s, %d", "Hello", 123));
- Unicode 15.0 支持:
String text = "Hello, world!";
System.out.println(text.length()); // 13
- JShell 增强:
jshell> var name = "John Doe";
name
$1 ==> "John Doe"
-
其他改进:
-
改进的垃圾收集器
-
新的 API 和工具
具体的使用案例:
- 文本块: 第三版: 可以用来编写多行字符串,并进行格式化。
- Unicode 15.0 支持: 可以使用新的 Unicode 字符。
- JShell 增强: 可以更方便地使用 JShell。
- 其他改进: 可以提高 Java 应用程序的性能、安全性和可维护性。
Java 19:
1. Pattern Matching for switch (Preview)
更加简洁地编写代码,提高代码的可读性。
switch (obj) {
case Person person:
System.out.println("Person: " + person.name);
break;
case Integer i:
System.out.println("Integer: " + i);
break;
case String s:
System.out.println("String: " + s);
break;
default:
System.out.println("Unknown type: " + obj.getClass().getName());
}
具体的使用案例:
- 可以使用模式匹配 for switch 语句来代替传统的多重 if-else 语句,使代码更加简洁易读。
- 可以使用模式匹配来提取数据,例如从字符串中提取数字或日期。
2. Record Patterns (Preview)
可以更加方便地匹配记录类型
record Person(String name, int age) {}
switch (person) {
case Person(name, age) when age > 18:
System.out.println("Adult: " + name);
break;
case Person(name, age):
System.out.println("Child: " + name);
break;
}
具体的使用案例:
- 可以使用 Record Patterns 来匹配记录类型的字段值,例如匹配成年人或儿童。
- 可以使用 Record Patterns 来解构记录类型,例如提取姓名和年龄。
3. Text Blocks: Third Edition (Standard)
更加方便地编写多行字符串。
String text = """
This is a multiline
string literal with
interpolation.
""";
System.out.println(text.formatted("%s, %d", "Hello", 123));
具体的使用案例:
- 可以使用文本块来编写多行字符串,例如文档注释或 SQL 查询。
- 可以使用文本块来进行格式化,例如插入变量或表达式。
4. Virtual Threads (Preview)
可以更加轻量级地执行任务,提高应用程序的性能。
var thread = VirtualThread.of(() -> {
// ...
});
thread.start();
5. Project Loom (Incubating)
是一个孵化项目,旨在改进 Java 应用程序的性能和可扩展性。
参考资料:
- Java 官方网站: https://www.java.com/
- Java SE Documentation: JDK 21 Documentation - Home
- Java 官方文档: JDK 19 Documentation - Home
- Java 版本发布说明: JDK 19 Releases
本文回顾了Java自1995年至今的关键版本更新,包括新特性如Lambda表达式、StreamAPI、模块化、G1收集器等,以及代码示例和具体使用案例,展示了Java语言演进对开发的影响。
2480

被折叠的 条评论
为什么被折叠?



