Java 作为一种广泛使用的编程语言,经历了多次更新和迭代。每个新版本都带来了许多新特性、改进和优化。以下是 Java 主要版本之间的更新迭代和区别,并介绍了一些流行版本。
Java SE 6 (2006)
Java 6 是一个重要版本,主要侧重于性能改进和库的增强。
- 脚本语言支持:引入了对脚本语言(如 JavaScript)的支持,通过 JSR 223。
- Web 服务增强:提供了对 Web 服务的更好支持。
- 编译器 API:引入了 Java 编译器 API(JSR 199),允许 Java 程序在运行时调用编译器。
Java SE 7 (2011)
Java 7 引入了一些语法糖和增强特性。
- try-with-resources 语句:简化了资源管理,自动关闭资源。
- 菱形操作符(<>):简化泛型实例化。
- 字符串在 switch 语句中的使用:允许在 switch 语句中使用字符串。
- 二进制字面量和数字下划线:引入了二进制字面量和在数字中使用下划线提高可读性。
- Fork/Join 框架:引入了用于并行编程的 Fork/Join 框架。
Java SE 8 (2014)
Java 8 是一个里程碑版本,带来了许多新的特性和改进。
- Lambda 表达式:简化了函数式编程,允许将行为作为参数传递。
- Stream API:提供了一种高效的数据处理方式,支持链式操作和并行计算。
- 新日期和时间 API:引入了
java.time
包,改进了日期和时间的处理。 - 默认方法:允许在接口中定义默认实现方法。
- Nashorn JavaScript 引擎:替代了 Rhino,提供更好的性能。
Java SE 9 (2017)
Java 9 带来了模块化系统和其他改进。
- 模块化系统(Project Jigsaw):引入模块系统(Java Platform Module System),提高应用程序的可维护性和安全性。
- JShell:引入了交互式编程工具 JShell(REPL)。
- 集合工厂方法:简化了集合的创建,例如
List.of()
、Set.of()
等方法。 - 多版本兼容的 JAR 文件:允许在一个 JAR 文件中包含针对不同 Java 版本的类文件。
Java SE 10 (2018)
Java 10 是一个快速发布周期的版本,带来了一些新的特性。
- 局部变量类型推断(var):引入了局部变量类型推断,简化了变量声明。
- 垃圾回收器接口:增强了垃圾回收器的灵活性和可插拔性。
- 并行 Full GC for G1:改进了 G1 垃圾回收器的性能。
Java SE 11 (2018)
Java 11 是一个长期支持版本(LTS),带来了许多重要的特性和改进。
- 新的字符串方法:如
isBlank()
、lines()
、strip()
、repeat()
等。 - HttpClient API:标准化了新的 HttpClient API,用于 HTTP/2 和 WebSocket 支持。
- 嵌套类的支持:增强了嵌套类的支持。
- 移除了不推荐使用的 API:如 Java EE 和 CORBA 模块。
Java SE 12 (2019)
Java 12 引入了增量的改进和新特性。
- Switch 表达式(预览):简化了 switch 语句的使用。
- JVM 常量 API:为 JVM 常量池项提供了一个新的 API。
Java SE 13 (2019)
Java 13 继续改进和优化。
- 文本块(预览):简化了多行字符串的书写。
- 动态 CDS 归档:增强了类数据共享(CDS)的功能。
Java SE 14 (2020)
Java 14 带来了更多改进和新特性。
- Switch 表达式(正式):改进了 switch 语句的表达能力。
- NPE 的改进描述:改进了 NullPointerException 的描述信息。
Java SE 15 (2020)
Java 15 引入了一些新的语言特性和改进。
- 隐藏类:引入了新的 API 来定义隐藏类,这些类专门用于框架生成的类。
- 文本块(正式):文本块特性变为正式特性。
Java SE 16 (2021)
Java 16 带来了更多语言特性和改进。
- 记录类型(Record):简化了数据类的定义。
- 密封类(Sealed Classes):限制类的扩展。
Java SE 17 (2021)
Java 17 是一个长期支持版本(LTS),引入了许多新的特性和改进。
- 模式匹配:增强了 instanceof 语句的能力。
- 密封类(正式):密封类特性变为正式特性。
- 强封装:模块系统中的强封装变得更严格。
现流行版本
- Java 8:由于其稳定性和丰富的特性,仍被广泛使用,尤其是在企业应用中。
- Java 11:作为 LTS 版本,很多项目已经从 Java 8 升级到 Java 11。
- Java 17:最新的 LTS 版本,推荐新项目使用,并鼓励老项目逐步升级。
具体代码演示
以下是展示各个版本特性的代码示例。
Java 8 示例
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Java8Features {
public static void main(String[] args) {
// Lambda 表达式
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
// Stream API
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames);
// 新日期和时间 API
LocalDate date = LocalDate.now();
System.out.println(date);
// 默认方法
MyInterface myInterface = new MyClass();
myInterface.defaultMethod();
}
}
interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method");
}
}
class MyClass implements MyInterface {
}
Java 9 示例
import java.util.List;
public class Java9Features {
public static void main(String[] args) {
// 集合工厂方法
List<String> names = List.of("Alice", "Bob", "Charlie");
System.out.println(names);
}
}
Java 10 示例
public class Java10Features {
public static void main(String[] args) {
// 局部变量类型推断
var message = "Hello, Java 10";
System.out.println(message);
}
}
Java 11 示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Java11Features {
public static void main(String[] args) throws Exception {
// 新的字符串方法
String str = " Hello World ";
System.out.println(str.strip());
// HttpClient API
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://postman-echo.com/get"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
Java 12 示例
public class Java12Features {
public static void main(String[] args) {
// Switch 表达式(预览)
var day = "TUESDAY";
var result = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
case "THURSDAY", "SATURDAY" -> 8;
case "WEDNESDAY" -> 9;
default -> throw new IllegalStateException("Unexpected value: " + day);
};
System.out.println(result);
}
}
Java 13 示例
public class Java13Features {
public static void main(String[] args) {
// 文本块(预览)
String text = """
{
"name": "Alice",
"age": 30
}
""";
System.out.println(text);
}
}
Java 14 示例
public class
Java14Features {
public static void main(String[] args) {
// Switch 表达式(正式)
var day = "MONDAY";
var result = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
case "THURSDAY", "SATURDAY" -> 8;
case "WEDNESDAY" -> 9;
default -> throw new IllegalStateException("Unexpected value: " + day);
};
System.out.println(result);
// 改进的 NPE 描述信息
try {
String str = null;
System.out.println(str.length());
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
Java 15 示例
public class Java15Features {
public static void main(String[] args) {
// 文本块(正式)
String text = """
{
"name": "Alice",
"age": 30
}
""";
System.out.println(text);
}
}
Java 16 示例
public class Java16Features {
public static void main(String[] args) {
// 记录类型
Person person = new Person("Alice", 30);
System.out.println(person.name());
System.out.println(person.age());
}
}
record Person(String name, int age) {}
Java 17 示例
public class Java17Features {
public static void main(String[] args) {
// 模式匹配
Object obj = "Hello, World!";
if (obj instanceof String str) {
System.out.println(str.toUpperCase());
}
// 密封类
Shape shape = new Circle(5.0);
System.out.println(shape.area());
}
}
sealed interface Shape permits Circle, Rectangle {
double area();
}
final class Circle implements Shape {
private final double radius;
Circle(double radius) {
this.radius = radius;
}
public double area() {
return Math.PI * radius * radius;
}
}
final class Rectangle implements Shape {
private final double length;
private final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double area() {
return length * width;
}
}
总结
以上展示了Java的主要版本及其关键特性。流行版本包括Java 8、Java 11和Java 17。Java 8因其稳定性和功能丰富仍被广泛使用,Java 11作为LTS版本被很多项目采用,Java 17是最新的LTS版本,推荐新项目使用。通过这些示例代码,开发者可以了解每个版本的新特性及其用法。