Java Definition
First Thing First
-
Java 由一组规范、JSR和JEP定义,均由 Oracle 发布,
-
这些规范是在OpenJDK项目的源代码中实现的。
-
有多家供应商提供该源代码的版本。有些供应商会对这些版本收费,有些则不收费。
供应商包括 Azul、SAP、Amazon、Microsoft、Oracle、BellSoft、Adoptium、Red Hat、IBM、Linux“apt get”、FreeBSD“Ports and Packages”等
Azul提供多种实现。Zulu Community是其中之一,免费提供。Zulu Enterprise是他们的另一款产品,是一款商业产品
Java历史
https://en.wikipedia.org/wiki/Java_version_history
LTS
Java 8 (LTS - Long-Term Support)
- 发布年份: 2014
- 主要特性:
- Lambda 表达式: 支持函数式编程,使代码更加简洁和易于维护。
- Stream API: 提供了一种新的操作集合的方式,如过滤、排序和映射,支持并行流处理。
- Optional 类: 用于避免
NullPointerException
,通过提供可选值的容器解决空值问题。 - 重复注解: 重复注释提供了将同一注释类型多次应用于同一声明或类型使用的功能
- 日期和时间 API (java.time): 引入了现代的日期和时间处理类,替代了旧的
java.util.Date
和java.util.Calendar
。 - 默认方法: 接口可以包含默认方法和静态方法,从而允许接口的演化,而不必破坏实现它们的现有代码。
- 方法参数的反射
- 集合:集合中提供了Stream相关API以支持对元素流进行函数式操作
- Quote:https://openjdk.org/projects/jdk/8/
Java 11 (LTS - Long-Term Support)
- 发布年份: 2018
- 主要特性:
- 局部变量类型推断 (var): 可以在本地变量声明时使用
var
关键字,编译器将推断变量的类型。 - HttpClient API: 引入了新的
HttpClient
API,替代旧的HttpURLConnection
,支持同步和异步 HTTP 请求,并且支持 HTTP/2 和 WebSocket。 - 删除了部分老旧的特性: 如 Java EE 和 CORBA 模块的删除。
- 字符串处理增强: 引入了新的方法,如
String::isBlank
,String::lines
,String::repeat
。 - 垃圾收集器改进: 引入了
ZGC
(Z Garbage Collector) 和Epsilon
垃圾收集器。 - Quote:https://openjdk.org/projects/jdk/11/
- 局部变量类型推断 (var): 可以在本地变量声明时使用
Java 17 (LTS - Long-Term Support)
- 发布年份: 2021
- 主要特性:
- 密封类/接口 (Sealed Classes): 允许类限制哪些其他类可以扩展它,使继承结构更加可控。
- 模式匹配 (Pattern Matching): 在
instanceof
关键字中引入了模式匹配,可以减少类型转换的冗余代码。 - 文本块 (Text Blocks): 多行字符串字面量,使处理多行字符串更加简洁和易读。
- 增强的 switch 语句: 支持 switch 表达式,使代码更简洁。
- 新垃圾收集器: ZGC 得到了进一步改进,G1 也得到了增强。
- 移除了部分过时的功能: 例如 Applet API 被删除,旧版的 Security Manager 被弃用。
- Quote:https://openjdk.org/projects/jdk/17/
Not LTS but important thingy
Java 9
Java 9 引入的模块系统(Project Jigsaw)是 Java 平台自推出以来最重大的变革之一。它不仅改变了如何组织代码和管理依赖关系,还对 JVM 的类加载机制进行了重大改革。以下是模块系统的详细说明及其对 JVM 类加载的影响:
1. 模块系统的背景
在 Java 9 之前,Java 程序的代码组织方式主要依赖于包和 JAR 文件。随着项目规模的扩大和复杂度的增加,传统的包管理方式在依赖管理、版本控制、访问控制等方面暴露出诸多问题。为了解决这些问题,Java 9 引入了模块系统,即 Project Jigsaw,以增强代码的封装性、模块化和可维护性。
2. 模块系统的核心概念
-
模块 (Module): 模块是 Java 9 新引入的顶层代码组织单位。一个模块包含了多个包以及相关资源,描述了哪些包对外暴露,哪些仅供模块内部使用。
-
module-info.java
: 每个模块都有一个module-info.java
文件,它是模块的描述符,用于定义模块的名称、依赖的模块、导出的包等。典型的module-info.java
文件如下:java">module com.example.module {requires java.sql;exports com.example.module.api; }
-
模块路径 (Module Path): 模块路径类似于类路径,但用于存放模块。JVM 使用模块路径来定位和加载模块及其依赖项。
3. 模块系统的主要功能
-
模块化 JDK: Java 9 将整个 JDK 分割成了多个模块,例如
java.base
、java.sql
、java.xml
等。java.base
是所有模块的基础模块,它包含了 Java 语言的核心类,例如java.lang
和java.util
。 -
强封装: 模块系统增强了封装性。通过
module-info.java
文件,可以指定哪些包可以被外部访问,哪些只能在模块内部使用。这避免了其他模块意外或错误地访问内部实现。 -
依赖管理: 模块系统自动管理模块间的依赖关系,解决了传统类路径中的“类路径地狱”问题。在类路径模式下,两个 JAR 文件中如果有同名类,可能会导致类加载冲突。而模块系统通过显式的依赖声明和强封装避免了这一问题。
4. 对 JVM 类加载机制的影响
模块系统的引入对 JVM 的类加载机制产生了深远的影响。以下是主要的变化:
a. 层次化的类加载
在 Java 9 之前,JVM 的类加载机制主要由根类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)组成。Java 9 的模块系统引入了层次化的类加载,模块层次被显式分开。
-
模块类加载器 (Module ClassLoader): 每个模块都有自己的类加载器,负责加载该模块中的类。模块类加载器之间有严格的隔离,一个模块中的类无法直接访问另一个模块中没有导出的类或包。
-
模块图 (Module Graph): JVM 使用模块图来管理模块之间的依赖关系。模块图是基于
module-info.java
文件构建的有向图,描述了所有模块及其依赖关系。类加载器根据模块图来解析和加载类。
b. 分层类加载模型
模块系统实现了分层类加载模型,使得模块类加载器之间可以形成分层关系。依赖的模块形成一个树形结构,每个模块只能访问其依赖模块中的公开部分。
- 模块的访问控制: 由于模块的访问控制机制,模块类加载器只能加载其依赖模块中导出的类。未导出的包或类对其他模块不可见,从而提升了安全性和封装性。
c. 隐式读取
在模块系统中,JVM 会自动处理模块间的依赖关系。当一个模块声明依赖另一个模块时,JVM 会确保在类加载时按照依赖关系加载所需模块。
5. 迁移现有代码到模块系统
对于已有的 Java 应用程序,Java 9 仍然支持传统的类路径模式,但鼓励开发者逐步迁移到模块系统。
-
自动模块 (Automatic Modules): 为了兼容现有的 JAR 文件,Java 9 引入了自动模块的概念。如果一个 JAR 文件放置在模块路径中但没有
module-info.java
文件,JVM 会自动将其视为模块,并生成一个默认的模块名。 -
未命名模块 (Unnamed Module): 类路径中的所有 JAR 文件都会被包含在一个未命名模块中,用于保持对旧版代码的兼容性。
6. 模块系统的优势
- 更好的封装性: 通过显式的导出和依赖声明,模块系统增强了代码的封装性,避免了意外依赖和类路径冲突。
- 改进的安全性: 模块系统防止了未授权的包和类访问,提升了系统的安全性。
- 简化依赖管理: 模块系统自动管理依赖关系,简化了大型项目的依赖管理,解决了传统类路径模式下的复杂性。
总结
Java 9 引入的模块系统(Project Jigsaw)不仅改变了 Java 平台的代码组织方式,还对 JVM 的类加载机制进行了深远的改革。通过模块系统,Java 开发者可以更好地管理代码的依赖和封装,增强应用程序的可维护性、安全性和性能。模块系统虽然引入了新的复杂性,但它为大型应用程序的开发提供了更清晰的结构和更强大的工具。
Non-LTS quick view
尽管 Java 9、12、13、14、15、16 这些版本没有像 LTS 版本那样广泛使用,它们还是引入了一些非常重要的新功能和改进。
1. Java 9
- 模块系统 (Project Jigsaw): 引入了模块化系统(Jigsaw 项目),允许开发者将应用程序划分为模块,并控制模块间的依赖关系和访问级别。
module-info.java
是新的模块定义文件。 - JShell: 提供了一个交互式编程环境(REPL),允许开发者在命令行中快速执行 Java 代码片段。
- 集合工厂方法: 通过
List.of()
,Set.of()
,Map.of()
等方法快速创建不可变集合。 - 改进的JVM性能: 包括G1垃圾收集器成为默认GC等。
2. Java 12
- Switch 表达式(预览): 允许
switch
用作表达式,而不仅仅是语句,简化了条件分支的写法,并减少了break
语句的使用。 - JVM 常量动态支持 (JEP 335): 为 JVM 提供了更灵活的常量表达机制,有助于实现更多的字节码优化和语言级别的改进。
3. Java 13
- 文本块(预览): 引入了多行字符串文本块的概念,使用
"""
来定义多行字符串,减少了转义字符的使用,增强了代码可读性。 - Switch 表达式增强(预览): 对 Java 12 中的 switch 表达式进行了进一步改进,加入了
yield
关键字用于返回值。
4. Java 14
- Records(预览): 简化了只包含数据的类(即POJO)的定义,通过
record
关键字可以快速定义一个不可变的数据类。 - Pattern Matching for
instanceof
(预览): 简化了instanceof
操作的模式匹配,可以在instanceof
检查后直接进行类型转换。 - NPE 提示增强: 改进了空指针异常(NPE)的错误信息,使调试更加简单和直接。
5. Java 15
- 文本块正式引入: Java 13 和 14 中的文本块功能正式成为语言的一部分。
- Sealed Classes(预览): 允许类和接口限制可以扩展或实现它们的类,为更严格的继承层次结构提供支持。
- Hidden Classes: 引入了可以在JVM中动态生成并加载的隐藏类,适用于框架开发中需要生成代理类等场景。
6. Java 16
- Records 正式引入: Java 14 中的 Records 功能正式成为语言的一部分,用于简化不变数据类的定义。
- Pattern Matching for
instanceof
正式引入: 在 Java 14 中引入的instanceof
模式匹配正式成为语言特性。 - Sealed Classes 第二预览: 对 Java 15 中引入的 Sealed Classes 进行了改进。
- 包装类的空指针检查: 改进了自动装箱和自动拆箱中的空指针异常检查。
总结
这些版本虽然不是 LTS 版本,但它们引入了许多重要的新功能,逐步提升了 Java 语言的表达能力和性能。这些新特性也为开发者在日常编程中提供了更多的便利和效率。随着这些功能的逐渐成熟,它们中的大部分已被集成到 Java 17 中,成为主流开发工具的一部分。
选择你的JDK
https://i.sstatic.net/P4Gmt.png