
Java 新特性
文章平均质量分 86
从Java SE 7开始,一直到最新版本的Java,持续更新中。
GreyZeng
程序员,架构师,项目经理
展开
-
Java SE 24 新增特性
在这两种情况下,即通过 long、float、double 和布尔类型进行 switch 以及使用基元变量进行模式匹配时,与所有新的 switch 功能一样,switch 必须要涵盖所有可能的情况。这个功能在 JDK 23 上是第二次预览,现在是第三次预览,下述代码中,Child1的构造函数,只能先通过super构造父类,然后才能初始化子类的 b 这个变量。这个功能在JDK 23 上是第一次预览,主要功能是通过简洁地导入模块导出的所有包的功能来增简化了模块库的重复使用,但不要求导入代码本身必须在模块中。原创 2025-03-19 17:26:31 · 767 阅读 · 0 评论 -
Java SE 23 新增特性
在这两种情况下,即通过 long、float、double 和布尔类型进行 switch 以及使用基元变量进行模式匹配时,与所有新的 switch 功能一样,switch 必须要涵盖所有可能的情况。通过 instanceof 和 switch,我们可以检查对象是否属于特定类型,如果是,则将该对象绑定到该类型的变量,执行特定的程序路径,并在该程序路径中使用新变量。在 JDK 23 之前,下述代码中,Child1的构造函数,只能先通过super构造父类,然后才能初始化子类的 b 这个变量。原创 2024-09-19 00:06:36 · 1154 阅读 · 0 评论 -
Java SE 22 新增特性
在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。在 Java SE 11 中,无法执行,因为只支持单个 Java 文件运行,但是到了 Java SE 22,可以支持多个文件源码运行,比如上述两个类,在 Java SE 22 下,可以通过。然而,一旦我们添加更多的 Java 文件,Java 11 中所谓的 "启动单个文件源代码 "机制就不再起作用了。在 Java 19 中,原创 2024-03-20 00:04:28 · 919 阅读 · 0 评论 -
Java SE 21 新增特性
该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览版,在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。该功能首次在 Java SE 17 中预览,在在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。作为本版本的预览功能推出。字符串模板是对 Java 现有字符串字面量和文本块的补充,它将字面文本与嵌入式表达式和模板处理器结合起来,从而产生专门的结果。原创 2023-09-25 14:12:01 · 455 阅读 · 0 评论 -
Java SE 20 新增特性
中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。此外,在 Java SE 20 中,移除了对 record 命名模式的支持,在 Java SE 19 中,如下写法是对的。中,Java SE 20 的 record 支持类型推断,例如,定义了如下数据结构。在 Java SE 20 之前,需要这样做。原创 2023-05-03 20:02:59 · 806 阅读 · 1 评论 -
Java SE 19 虚拟线程
有一个所谓的载体线程池,一个虚拟线程被临时映射到该池中。一旦虚拟线程遇到阻塞操作,该虚拟线程就会从载体线程中移除,而载体线程可以执行另一个虚拟线程(新的或之前被阻塞的)。虚拟线程解决了这个问题,从 Java 代码的角度来看,虚拟线程感觉就像普通的线程,但它们不是。这使得我们可以编写灵活的代码,在运行时决定它应该在虚拟线程还是平台线程中运行。,而这些线程是很消耗资源的,如果启动的线程过多,会给整个系统的稳定性带来风险。创建的执行器服务,为每个任务创建一个新的虚拟线程。,我们也可以明确地启动虚拟线程。原创 2022-09-26 20:09:15 · 872 阅读 · 0 评论 -
Java SE 16 record 类型说明与使用
假设我们想创建一个不可变的类 Point,它有 x 和 y 的坐标。我们想实例化Point对象,读取它们的字段,并将它们存储在 List 中或在 Map 中作为键值使用。如果要覆盖 record 的默认构造函数,则函数入参一定要和 record 的入参保持一致,否则会报错。和我们最初始的 Point 类定义是一样的,所以 record 可以大量简化代码的编写。record 中可以自定义非 static 方法,例如。record 也可以实现接口,但是无法继承类。我们可以像正常使用类一样使用 record。原创 2022-09-23 16:22:29 · 987 阅读 · 0 评论 -
Java SE 19 新增特性
在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。如果一个任务由不同的子任务组成,可以并行完成(例如,从数据库访问数据、调用远程 API 和加载文件),我们可以使用 Java 多线程的一些工具类来完成。Java SE 19,构造哈希表的时候,由于有扩容因子 0.75 的设置,所以如果要开辟一个 120 空间的哈希表,需要如下定义。,我们等待所有任务完成–或者至少有一个任务失败或被取消。原创 2022-09-22 13:36:06 · 761 阅读 · 0 评论 -
Java SE 18 新增特性
在 Java SE 18 之前的 Java中,标准字符集会因操作系统和语言设置的不同而不同。Java 标准字符集决定了在 JDK 类库的许多方法中如何将字符串转换为字节,反之亦然(例如,在写入和读取文本文件时)。当一个应用程序在一个环境中被开发和测试,然后在另一个环境中运行( Java 选择了不同的默认字符集),这可能导致不可预测的行为。方案一:在调用所有将字符串转换成字节的方法时指定字符集,反之亦然。其次,如上所述,指定的字符集并不用于所有的 API 方法。这个方案会导致大量的代码重复,容易出错。原创 2022-08-22 13:22:22 · 812 阅读 · 0 评论 -
Java SE 17 新增特性
从 Java 9 引入模块化开始,JDK 对于其内部的 API 的访问限制就已经明确开始落地,只是当时我们可以通过配置启动参数 --illegal-access 来继续使用 JDK 的内部 API,其中 Java 9 ~ Java 15 这个参数默认 permit,Java 16 默认 deny。然而,这个功能自从它们被引入后就没有什么用处了,而且需要大量的精力来维护它,所以这个 JEP 删除了基于 Java 的实验性超前(AOT)和及时(JIT)编译器。包下面的类及其成员也是内部 API。原创 2022-08-22 07:19:33 · 410 阅读 · 0 评论 -
Java SE 16 新增特性
Sealed Classes 是在Java SE 15中首次引入的,它提供了一种机制来确定哪些子类被允许扩展或实现父类或接口。要注意的是,jpackage 不支持交叉编译,也就是说在 windows 平台上是不能打包成 MacOS 或者 Linux 系统的软件格式的。在 Java SE 14 中开始作为预览功能,Java SE 16 中被正式启用。在 Java SE 14 中是预览功能,到Java SE 16中正式启用。作为对接口中默认方法的增强,随着 Java SE 16 的发布,Linux 平台下为。原创 2022-08-21 23:06:24 · 293 阅读 · 0 评论 -
Java SE 15 新增特性
如果没有一个密封的类,编译器就不能合理地确定所有可能的子类都被我们的 if-else 语句所覆盖。隐藏类的目标是允许在运行时创建不能被发现的类。像这样的类通常有一个很短的生命周期,因此,隐藏类被设计成在加载和卸载时都很高效。instanceof 类型匹配功能在 Java SE 14 中进行了预览,Java SE 15 旨在继续其预览状态,没有新的增强功能。请注意,当前版本的 Java 确实允许创建类似于隐藏类的匿名类。这种有限的、详尽的层次结构是使用密封类的一大好处。然而,默认的垃圾收集器仍然是 G1。原创 2022-08-21 17:04:59 · 248 阅读 · 0 评论 -
Java SE 14 新增特性
这个功能在 Java SE 14 中是预览功能。switch 表达式在 Java SE 12 和 Java SE 13 中一直是预览功能,现在在 Java SE 14 中成为正式功能。在 Java SE 14 后,优化了 NPE 的报错提示,在 Java SE 14 下执行,报错信息如下。在Java SE 14 中,Text Blocks 仍处于预览阶段,并增加了一些新功能,增加了。Records 到 Java SE 16 正式发布,在 Java SE 14 中是预览功能。原创 2022-08-21 10:45:00 · 416 阅读 · 0 评论 -
Java SE 10 Application Class-Data Sharing 示例
通常来说,如果要执行 class 字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM 需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来。Application Class-Data Sharing 扩展了 CDS,不仅可以将 JDK 类库,还可以将应用程序的类存储在 JSA 文件中,并在 JVM 进程中共享。在这个过程中,类文件被从档案中提取出来,转换为特定架构的二进制形式,并存储在JVM进程的主内存中。清单,这里面不仅有 JDK 的 class,也有应用程序的 class。原创 2022-08-20 16:02:20 · 309 阅读 · 0 评论 -
Java SE 13 新增特性
因此,在 Java 13 中引入了新的实现方式,使用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。java.net.Socket 和 java.net.ServerSocket 类早在 Java 1.0 时就已经引入了,它们的实现的 Java 代码和 C 语言代码的混合,维护和调试都十分不易;ZGC 是 Java SE 11 中引入的一个实验性垃圾收集器,它承诺在10毫秒或更短的时间内实现 stop-the-world。默认情况下,这个值是300秒。原创 2022-08-20 09:51:20 · 253 阅读 · 0 评论 -
Java SE 12 新增特性
如果两个文件是一样的,该方法返回 -1。否则,它返回两个文件不同的第一个字节的位置。如果其中一个文件在检测到差异之前结束,则返回该文件的长度。我们可以指定两个收集器(称为下游收集器)和一个合并函数,将两个收集器的结果合并。对于某些要求,你可能想用两个收集器来终止一个流,而不是一个,并将两个收集器的结果结合起来。,我们可以创建一个格式化器。一种方法是写一个自定义的收集器,将最小值和最大值累积到一个2元素的。语句,并使用箭头符号来消除容易出错的中断语句,这个特性在。方法将一个任意的函数应用于一个字符串。原创 2022-08-19 21:20:13 · 218 阅读 · 0 评论 -
Java SE 11 新增特性
JPMS 的另一个优点是,现在可以创建一个仅包含应用程序所需模块的 Java 运行时,从而大大减小了依赖包的大小。通过明确定义的模块边界,现在可以更轻松地删除 Java API 中过时的部分。如果您尝试编译或运行一个应用程序,该应用程序在 JDK 9 或 JDK 10 上使用这些模块中的 API 的时候会报错。如果在代码中使用这些模块中的 API,则需要将它们作为单独的模块或库提供。元模块包括六个模块,这些模块将不再是 Java SE 11 标准的一部分,也不再包含在 JDK 中。这里有一个简单的例子。..原创 2022-08-18 14:54:58 · 209 阅读 · 0 评论 -
Java SE 10 新增特性
而在 Java 10 中还是做了小小调整,当 G1 的并发收集线程不能快速的完成全 GC 时,就会自动切换到并行收集,这可以减少在最坏情况下的 GC 速度。在Java中,var是一个特殊的新类型,你仍然可以在你的代码的其他地方使用var,比如作为一个变量或类名。第一步是创建应该被归档的类的列表,用适当的标志启动你的应用程序,并指出你希望列表被存储的位置。共享数据缓存意味着小型应用程序的启动时间有了很大的改善,因为在这种情况下,核心类的相对大小要大于应用程序本身。方法的返回类型,读者就不可能知道x的类型。..原创 2022-08-17 23:00:11 · 199 阅读 · 0 评论 -
Java SE 9 模块化示例
当模块A需要模块B时,模块A称为读取模块B,模块B由模块A读取。to 指令使您能够在逗号分隔的列表中精确指定哪些模块或模块的代码可以访问导出的包,这称为限定导出。引用b模块,那么c模块即便没有直接声明依赖于b模块,它对b模块也是具有可读性的,这个称之为隐含可读性。工具有许多新的选项(见jar -help),其中之一是打印作为模块化JAR打包的模块的模块声明。开头,后跟唯一的模块名称和括在大括号中的模块正文,格式如下。的文件中定义的模块声明的编译版本。选项指定的是主模块,斜线后的值是模块中主类的类全名。...原创 2022-08-16 23:33:48 · 315 阅读 · 0 评论 -
Java SE 9 多版本兼容 JAR 包示例
Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在同一个 Jar 包中我们可以包含多个 Java 版本的 class 文件,这样就能做到 Jar 包升级到新的 Java 版本时不用强迫使用方为了使用新 Jar 包而升级自己的业务模块 Java 版本,也不用针对不同最低支持 Java 版本提供不同的 Jar,真正的做到了一个 Jar 包兼容所有的目的。文件配置,注意,相关的文件夹或者包有调整,需要做对应的调整。目录下存的是新版本 JDK 编写的代码。类用新的 JDK 版本特性来实现。原创 2022-08-15 11:48:34 · 368 阅读 · 0 评论 -
Java SE 9 新增特性
是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。在各种访问模式下都支持访问这些变量,包括简单的读/写访问,引入了模块系统,模块就是代码和数据的封装体。有着相似的功能,但会更加安全,并且,在并发方面也提高了不少性能。接口的实例标识一个本地进程,它允许查询进程状态并管理进程,的解释器类似,可以直接输入表达式并查看其执行结果。就可以使用它,并得到相同的结果。中包含值,那么就返回包含这个值的。指定的值,否则返回一个预设的值。包含值,则对其包含的值调用函数。...原创 2022-08-14 18:04:35 · 287 阅读 · 0 评论 -
Java SE 8 新增特性
可以用一个 Lambda 表达式来指定这个动作。在 Java SE 8 中,接口可以支持默认方法,即:我们可以指定接口的某个方法的默认实现,这样的话,子类就不需要重写这个方法,可以使用接口的默认实现,同时,Java SE 8 中,接口也支持静态方法。更好的一种方式是,定义一个 Local Class,将规则分离出来,这样一来,规则无论如何变化,主流程的代码是不需要调整的,以上述例子来说明。上述代码中,如果要在接口中添加一个方法,那么所有实现这个接口的客户端都要重新实现这个方法,非常麻烦。原创 2022-08-13 17:40:53 · 448 阅读 · 0 评论 -
Java SE 7 新增特性
这一特性使你能够在数字中分隔数字组,这可以提高代码的可读性。例如,如果你的代码中包含有许多数字,你可以使用下划线字符将数字分成三组,类似于你使用逗号或空格等标点符号作为分隔符的方式。它可以进行渐进式的文件遍历,每次读取一定数量,降低遍历时的性能开销,但是。也就是可以动态的监测指定目录的文件或者内容的变化,被监视的对象要实现。此外,还可以指定抛出异常类型,而不需要每次都抛出一个大而全的。遍历时只会遍历它的直接目录和文件,不会递归的遍历子目录。接口的实现,同时指定要监视的事件类型。我们可以指定抛出的异常类型。.原创 2021-11-17 10:59:20 · 602 阅读 · 0 评论