高级农民
- 积分
- 1400
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-9-16
- 最后登录
- 1970-1-1
|
本帖最后由 Cabbage1123 于 2024-9-1 20:02 编辑
2024-09-01
今天出去玩了半天,有钱真好,可以买各种各样好玩的东西。买了橡皮船(Amazons上卖的香蕉船),还有桨板,还有Rafting用的漂浮圈,这两天到了。
迫不及待去Deer lake划船,用自己买的船的好处就是不用有时间焦虑,想玩多久玩多久,想停多久就停多久。真的好开心,好自由。
回家学习Java,在这里总结一下 Java 8 ~ Java 21 各个版本的特性(Chatgpt告诉我的)
补充内容 (2024-09-02 11:02 +08:00):
Java 8 到 Java 17 之间的版本引入了许多新特性和改进。以下是每个版本中新增和重要的变化的详细介绍:Java 8 (2014年3月)
Java 8 是一个具有里程碑意义的版本,带来了许多新的特性:- Lambda 表达式:这是 Java 8 的主要特性,允许在代码中使用函数式编程风格。例如:
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(s -> System.out.println(s));
- 函数式接口:引入了 @FunctionalInterface 注解,确保接口中只能有一个抽象方法,例如 Runnable 和 Comparator。
- Stream API:允许以声明性方式处理集合的操作链,例如过滤、映射和减少:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
- 默认方法:接口可以有默认方法,这意味着接口可以有方法的默认实现。
- Optional 类:用于防止空指针异常(NullPointerException),表示可能存在或不存在的值。
- 新的日期时间 API:引入了 java.time 包,它提供了更好的日期和时间处理方式,例如 LocalDate, LocalTime, LocalDateTime, 和 ZonedDateTime。
- Nashorn JavaScript 引擎:替代 Rhino,提供更好的 Java 与 JavaScript 之间的互操作性。
- 并行数组:java.util.Arrays 提供的并行排序、并行设置和并行填充方法,用于多线程操作。
Java 9 (2017年9月)
Java 9 引入了几个重要的特性,特别是在模块化方面:- 模块系统 (Project Jigsaw):引入了模块化系统 (java modules),使得开发者可以将应用程序拆分成更小、更可管理的模块。模块描述符放在 module-info.java 文件中。
- JShell:交互式编程工具,允许开发者在命令行上测试 Java 代码片段。
- 集合工厂方法:在 List, Set, 和 Map 中添加了方便的工厂方法,可以轻松创建不可变集合:
List<String> list = List.of("a", "b", "c");
- 流 (Stream) API 增强:新增了方法,例如 takeWhile, dropWhile 和 iterate,以增强 Stream 操作的灵活性。
- 私有接口方法:可以在接口中定义私有方法,以供默认方法或静态方法使用,增强了代码的模块化和重用性。
- 改进的编译器和性能:Java 9 改进了 JIT 编译器,增强了启动时间和内存占用优化。
Java 10 (2018年3月)
Java 10 是一个短期支持版本,主要引入了一些小的改进和新特性:- 局部变量类型推断 (var):允许在局部变量的声明中使用 var 关键字,由编译器推断类型:
var list = new ArrayList<String>();
- GC 改进:引入了并行全局垃圾回收器 G1 和其它垃圾回收器的性能改进。
- 应用类数据共享 (AppCDS):允许将应用程序类加载器加载的类数据共享在多个 Java 虚拟机实例之间,减少启动时间和内存占用。
- 根证书:将默认的根证书直接包含在 JDK 中,增强了安全性。
Java 11 (2018年9月)
Java 11 是一个长期支持 (LTS) 版本,提供了许多改进和一些重要的新特性:- 新的字符串方法:例如 isBlank(), lines(), strip(), repeat(int),这些方法增强了字符串操作的便捷性。
- HttpClient API:标准化了 java.net.http 包,提供了同步和异步的 HTTP 客户端支持,替代了原先的 HttpURLConnection。
- 局部变量推断增强:var 关键字支持 lambda 表达式中的局部变量。
- 废弃和移除:
- 移除了 Java EE 和 CORBA 模块。
- 废弃了 Nashorn JavaScript 引擎。
- 运行 Java 文件:可以直接使用 java 命令运行单个 Java 源文件,无需显式编译:
java HelloWorld.java
Java 12 (2019年3月)
Java 12 主要引入了一些实验性功能和语言增强:- Switch 表达式 (预览):Switch 可以作为一种表达式使用,并且支持多标签模式:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
default -> {
var len = day.toString().length();
yield len;
}
};
- Shenandoah GC (实验性):一种低暂停时间垃圾回收器。
- JVM 常量 API:用于描述常量池中的常量。
- 字符串增强:新增了 transform 方法和 indent 方法,以简化字符串处理。
Java 13 (2019年9月)
Java 13 带来了一些语言和平台级别的改进:- 文本块 (预览):多行字符串字面量,可以保留字符串的格式和内容的可读性,使用 """ 包围:
String json = """
{
"name": "John",
"age": 30
}
""";
- Switch 表达式的改进:继续作为预览特性存在,增加了更好的匹配控制和语法。
- 动态 CDS 档案:增强了类数据共享功能,允许在运行时为未加载的类动态生成共享档案。
- ZGC 改进:引入未使用的内存回收和可扩展的内存限制。
Java 14 (2020年3月)
Java 14 继续增加了一些实验性功能:- Switch 表达式 (正式引入):作为 Java 标准的一部分引入,消除了多标签的重复代码。
- 记录 (Records) (预览):用于定义不可变数据载体类,简化数据类的编写:
public record Point(int x, int y) {}
- instanceof 模式匹配 (预览):改进 instanceof 操作符,减少显式类型转换:
if (obj instanceof String s) {
System.out.println(s.length());
}
- NullPointerException 改进:增强了 NullPointerException 的诊断信息,提供更明确的错误原因。
- Foreign-Memory Access API (孵化器):实验性的 API,用于更高效地访问和操作非 Java 堆内存。
Java 15 (2020年9月)
Java 15 引入了多个新特性:- 文本块 (正式引入):文本块成为 Java 语言的一部分,正式支持多行字符串。
- 密封类 (预览):密封类允许开发者控制哪个类可以扩展或实现它,从而增强了类的封装性:
public abstract sealed class Shape
permits Circle, Square {
}
- ZGC 成为生产可用的特性:ZGC 垃圾回收器从实验性状态中移除,成为正式的生产可用垃圾回收器。
- Records (第二预览):进一步改进和修复了 Records 的设计。
- instanceof 模式匹配 (第二预览):继续优化和扩展模式匹配的使用。
- Hidden 类:用于字节码生成的内部类的定义,帮助提高动态代理类的性能。
Java 16 (2021年3月)
Java 16 引入了多个语言级和平台级的增强:- Records (正式引入):记录类作为 Java 语言的一部分,正式推出,简化了不可变数据类的定义。
- instanceof 模式匹配 (正式引入):instanceof 模式匹配正式成为 Java 语言的一部分。
- 密封类 (第二预览):密封类得到进一步增强,允许更多的使用场景。
- ZGC 并行垃圾收集:ZGC 的垃圾回收并行化,使其性能进一步提升。
- 强封闭性 JDK:JDK 模块进一步封闭,不允许不规范的访问。
- 外部函数和内存 API (孵化器):提供更简洁和安全的 API 用于与非 Java 堆内存交互。
Java 17 (2021年9月)
Java 17 是另一个长期支持版本 (LTS),带来了稳定的语言特性和平台改进:- 密封类 (正式引入):密封类正式成为 Java 语言的一部分,允许开发者限制子类的类型。
- 模式匹配 for switch (预览):在 switch 语句中引入模式匹配,使得代码更为简洁和灵活。
- 移除 RMI 激活:RMI 激活机制被移除,反映了这一远程调用技术的使用减少。
- 加强的 JDK 安全性:通过封闭内部 API 和引入更严格的访问控制来加强安全性。
- 更强大的 G1 GC:G1 垃圾回收器进一步优化,提高了并发性能和内存管理能力。
- 外部函数和内存 API (第二孵化器):进一步改进了该 API,使其在与本地代码交互时更加稳定和易用。
这些新特性不仅使得 Java 更加现代化,也提升了开发效率和运行时性能,为开发者提供了更强大、灵活的工具链。
Java 17 到 Java 21 之间的版本引入了多个新特性和改进。以下是这些版本的详细介绍:Java 18 (2022年3月)
Java 18 是一个功能性版本,带来了一些新功能和改进:- UTF-8 默认字符集:Java 18 将 UTF-8 设置为默认字符集,这意味着无论在何种平台上,所有的字符编码和解码操作都会使用 UTF-8。
- 简单 Web 服务器:引入了一个简单的命令行 Web 服务器,用于静态文件的开发和测试。这对于快速启动一个 Web 服务器以托管静态内容非常有用:
jwebserver
- 代码段 API (孵化器):Java 引入了代码段 API (Code Snippets API),用于表示和操作代码段,这对于 IDE 和文档生成工具非常有用。
- 外部函数和内存 API (第二孵化器):继续改进了用于与非 Java 堆内存交互的 API。
- 向量 API (第三孵化器):向量 API 允许使用矢量计算优化代码,特别是对于需要高性能计算的应用程序。
Java 19 (2022年9月)
Java 19 继续增强现有功能,并引入了一些新的实验性特性:- 虚拟线程 (预览):虚拟线程(Project Loom)是 Java 并发模型的一项重大改进,它允许开发者创建大量的轻量级线程,以简化并发编程。虚拟线程是以非常低的成本管理的,这使得大规模并发更加高效。
- 结构化并发 (预览):这种 API 允许使用结构化的方式来处理多个线程的生命周期,使并发代码更加清晰和容易管理。
- 模式匹配 for switch (第二预览):在 switch 语句中进一步增强了模式匹配,允许更复杂和强大的匹配逻辑。
- 外部函数和内存 API (第三孵化器):继续发展和改进该 API,以更好地支持与本地代码和内存的交互。
- 向量 API (第四孵化器):进一步增强和优化了向量 API,用于高性能计算。
Java 20 (2023年3月)
Java 20 继续增强之前的预览和孵化器功能,并引入了一些新的实验性功能:- 虚拟线程 (第二预览):虚拟线程得到进一步的改进,增加了更多的功能,使得并发编程更为简便和高效。
- 结构化并发 (第二预览):结构化并发 API 进一步增强,提供更好的工具来管理并发任务。
- 记录模式 (预览):记录模式(Record Patterns)允许在模式匹配中使用记录的组件来解构对象,这使得处理复杂数据结构变得更容易:
record Point(int x, int y) {}
Object obj = new Point(3, 4);
if (obj instanceof Point(int x, int y)) {
System.out.println("x = " + x + ", y = " + y);
}
- 模式匹配 for switch (第三预览):再次改进模式匹配 for switch 的功能,使得匹配逻辑更为灵活和强大。
- 向量 API (第五孵化器):进一步增强向量 API,支持更多的数据类型和操作。
- 外部函数和内存 API (第四孵化器):继续改进该 API,以增强与本地代码的集成。
Java 21 (2023年9月)
Java 21 是一个长期支持版本 (LTS),并且引入了许多新特性和改进:- 虚拟线程 (正式引入):虚拟线程正式成为 Java 的一部分,极大地简化了大规模并发应用的开发,允许以更低的开销创建和管理线程。
- 结构化并发 (正式引入):结构化并发 API 也成为 Java 的一部分,为并发任务提供了更直观和安全的管理方式。
- 记录模式 (第二预览):记录模式继续作为预览功能存在,进一步增强了解构记录对象的能力。
- 模式匹配 for switch (正式引入):模式匹配 for switch 语句正式成为 Java 的一部分,极大地提升了 switch 语句的表达能力和灵活性。
- 外部函数和内存 API (第五孵化器):继续改进该 API,使其更为稳定和高效,适用于更多的场景。
- 向量 API (正式引入):向量 API 也正式成为 Java 的一部分,为需要高性能计算的应用程序提供了强大的工具。
- 字符串模板 (预览):引入了字符串模板(String Templates),允许在字符串中嵌入表达式并在运行时计算其值,这种模板机制使得字符串处理更加简洁和灵活:
String name = "world";
String message = STR."Hello, \{name}!";
- 新垃圾回收器 (ZGC 和 G1 增强):进一步优化了 ZGC 和 G1 垃圾回收器的性能和可伸缩性,使其更适合大规模应用。
这些版本的特性增强了 Java 的并发能力、模式匹配灵活性、与本地代码的集成以及高性能计算能力,为开发者提供了更强大的工具来应对现代应用程序的需求。
在Java的开发过程中,"孵化器"和"预览"是两个重要的概念,它们表示新特性在正式引入Java语言或平台之前的不同阶段。1. 孵化器 (Incubator)
孵化器是Java平台引入新API或新功能的早期阶段。在这个阶段,特性仍在积极开发和实验中。孵化器功能允许开发者提前体验和测试这些新功能,并且提供反馈,从而帮助开发者社区决定是否以及如何在未来的Java版本中正式引入这些特性。- 特点:
- API 或功能可能会在未来版本中大幅度更改。
- 该功能可能不会进入最终版本,或者会以不同的形式出现。
- 使用孵化器功能的代码在未来可能需要进行调整或重构。
- 示例:
- 外部函数和内存 API (Incubator):这是一个早期的API,允许Java程序更安全和高效地与非Java内存进行交互。因为它是一个孵化器功能,所以API的设计可能会在未来版本中发生变化。
2. 预览 (Preview)
预览阶段是在孵化器之后的一个开发阶段。在预览阶段,特性已经得到了更多的开发和稳定,但仍然在收集用户反馈,可能会进行一些微调。预览特性可以在实际生产环境中进行测试,但通常需要通过启用特定的编译器选项来使用。- 特点:
- 预览特性在发布时已经非常接近于最终设计。
- 仍有可能进行小幅修改或调整。
- 特性最终可能会成为标准部分,也可能被进一步推迟或修改。
- 开发者可以在实际项目中使用预览特性,以便为其发布提供反馈。
- 示例:
- Switch 表达式 (Preview):Java 12 中首次引入了Switch表达式的预览版,它允许在switch语句中返回值并使用更简洁的语法。随着社区的反馈,这个功能在后续版本中得到了完善,并最终在Java 14中成为正式特性。
总结
- 孵化器:是开发者探索新API或功能的早期阶段,提供实验性的功能。
- 预览:是更接近最终版本的阶段,开发者可以在实际项目中测试这些功能,并提供反馈,以便在正式发布之前进行微调。
通过这种多阶段引入新特性的方式,Java开发团队能够确保新功能的稳定性和实用性,同时与开发者社区保持紧密互动。 |
|