百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Java JDK8新特性介绍(从 Java 8 到 Java 15)

toyiye 2024-08-10 21:26 7 浏览 0 评论

作者将会从过去 6 年 Java 是如何进步的(从 Java 8 到 Java 15)

Java 发布周期


直到第 8 版,Java 版本每 3 年发布一次,因此版本很少但功能很多。

因此,交付新版本的 Java 很复杂,开发人员升级他们的应用程序也很复杂,因为其中包含的更改数量很多。

这种步伐已经跟不上IT世界一切都越来越快的现实了!所以 Java 架构师决定每 6 个月发布一个版本(因此有一个固定的时间表)

在每个版本中,所有现成的功能都包含在内,那些没有准备好的将在下一个版本中交付(不再是后期版本)。

Java 8 最重要的特性和示例

1) Java 语言的新特性
forEach() 方法
Java 8 在java.lang.Iterable 接口中引入了forEach 方法,使我们在编写代码时只关注业务逻辑。

Lambda 表达式
Java 8 最大的新特性是对lambda 表达式的语言级支持(Project Lambda)。
Lambda 表达式语法是 (argument) -> (body)。

接口的默认和静态方法
在java 8之前,java中的接口只能有抽象方法。默认情况下,接口的所有方法都是公共和抽象的。Java 8 允许接口具有默认方法和静态方法。

- 默认方法:我们在接口中使用默认方法的原因是允许开发人员向接口添加新方法而不影响实现这些接口的类。

-静态方法:在接口中类似于默认方法,除了我们不能在实现这些接口的类中重写这些方法。
例如,新的 Stream 接口上有很多静态方法。这使得“helper”方法更容易找到,因为它们可以直接位于接口上,而不是不同的
类,如 StreamUtil 或 Streams。

函数式接口
在Java 8 中,函数式接口被定义为具有一个抽象方法的接口。这甚至适用于使用以前版本的 Java 创建的接口。
Java 8 在包 java.util.function 中附带了几个新的函数式接口。
-Function - 获取类型 T 的对象并返回 R。
-Supplier - 仅返回类型 T 的对象。
-Predicate - 返回基于类型 T 的输入的布尔值。
-Consumer - 对给定的 T 类型对象执行操作.

方法引用
方法引用是一种特殊类型的lambda 表达式。它们通常用于通过引用现有方法来创建简单的 lambda 表达式。
有四种方法引用: -
静态方法
- 特定对象
的实例方法 - 特定类型的任意对象的实例方法 - 构造
函数示例

2) Java 库的新特性
Stream API
Stream 接口是Java 8 的一个基本组成部分。

我们可以使用 Java Stream API 来实现内部迭代,这样更好,因为 java 框架控制了迭代。

Stream 接口支持 map/filter/reduce 模式并延迟执行,构成了
Java 8 中函数式编程的基础(与 lambda 一起)。

出于性能原因,还有相应的原始流(IntStream、DoubleStream 和 LongStream)。

在 Java 8 中,Collection 接口有两种生成 Stream 的方法:
-stream():返回将集合作为其源的顺序流。

-parallelStream() :返回一个以集合为源的并行流。

Optional
Java 8 附带java.util 包中的Optional 类,用于避免空返回值(以及NullPointerException)。

如果存在一个值,isPresent() 将返回 true,而 get() 将返回该值。流终端操作返回 Optional 对象。
其中一些方法是: -
可选的 reduce(BinaryOperator accumulator) -
可选的 min(Comparator<? super T> comparator) -
可选的 max(Comparator<? super T> comparator) -
可选的 findFirst() -
可选的 findAny()

日期/时间 API
在 Java 8 中,引入了一个新的日期时间 API 来弥补旧日期时间 API 的以下缺点:
- 线程不安全 -
设计
不佳 - 时区处理困难

Java 8 Date Time API 由以下包组成:
1.java.time 包:这是新的Java Date Time API 的基础包。例如 LocalDate、LocalTime、LocalDateTime、Instant、Period、Duration 等。所有这些类都是不可变的和线程安全的。

  1. java.time.chrono 包:这个包定义了非 ISO 日历系统的通用 API。我们可以扩展 AbstractChronology 类来创建我们自己的日历系统。
  2. java.time.temporal 包:这个包包含时间对象,我们可以用它来找出与日期/时间对象相关的特定日期或时间。例如,我们可以使用这些来找出该月的第一天或最后一天。您可以轻松识别这些方法,因为它们的格式始终为“withXXX”。
  3. java.time.zone 包:该包包含支持不同时区及其规则的类。

Java 10 最重要的特性和示例

Java 10 是其 23 年历史上发布速度最快的 Java 版本。Java 因其缓慢的增长和演变而受到批评,但 Java 10 打破了这一概念。

局部变量类型推断
局部变量类型推断是Java 10 中对开发者最大的新特性。
与 Javascript、Kotlin 和 Scala 类似,现在 Java 也将有一个 var 关键字,允许您在不指定其类型的情况下声明局部变量。

基于时间的发布版本控制
从 JDK 10 版本开始,Java 采用了每六个月发布一个新版本的新时间表。这是否是一种实用的方法存在很多争论,大公司也赞赏 Java 的稳定性和到目前为止的低变化率。

Oracle 已对这些问题做出回应,并继续
定期提供长期版本,但
间隔时间也会更长。而在 Java 8 之后,就是 Java 11,它将
再次获得长期支持。

事实上,Java 9 和 Java 10 的支持刚刚结束,因为
Java 11 已经过时了。

应用程序类数据共享
此功能扩展了现有的 CDS 功能,允许将应用程序类放置在共享存档中,以改进启动和占用空间。

一般的想法是,当 JVM 首次启动时,加载的任何内容都被序列化并存储在磁盘上的文件中,可以在 JVM 未来启动时重新加载。

这意味着 JVM 的多个实例共享类元数据,因此不必每次都加载它们。

Parallel Full GC for G1
G1 垃圾收集器在JDK 9 中被默认。但是,G1 的full GC 使用单线程标记sweepcompact 算法。

这已更改为
Java 10 中的并行 mark-sweep-compact 算法,有效减少了 full GC 期间的 stop-the-world 时间。

此更改无助于
垃圾收集器的最佳性能时间,但它确实显着减少了最坏情况的
延迟。

Garbage-Collector Interface
这是一个更有趣和有用的Java 10 特性,它通过引入一个通用的Garbage Collector Interface 来改进不同垃圾收集器的代码隔离。

它将有助于将来在不更改现有代码库的情况下添加新的 GC,也有助于删除或清理以前的 GC。

根证书
在 Java 10 中,Oracle 开源了
Oracle 的 Java SE Root CA 程序中的根证书,以使 OpenJDK
构建对开发人员更具吸引力,并减少
这些构建与 Oracle JDK 构建之间的差异。

线程局部握手
这是JVM 的一项内部功能,可提高性能。
此功能提供了一种在不执行全局 VM 安全点的情况下对线程执行回调的方法。使停止单个线程成为可能且成本低廉,而不仅仅是停止所有线程或不停止。

API 新增
-List, Map & Set 接口新增静态copyOf(Collection) 方法。它返回一个不可修改的列表、映射或集合,其中包含所提供的条目。对于 List,如果给定的 List 随后被修改,则返回的 List 将不会反映此类修改。

- 可选及其原始变体获得方法 orElseThrow()。这与 get() 完全相同,但是 java 文档指出它是 get() 之后的首选替代方法。

-Collectors 类获取用于收集不可修改的集合(Set、List、Map)的各种方法。

Java 11 最重要的特性和示例

Java 11 是 Java 8 之后的第二个 LTS 版本。从 Java 11 开始,Oracle JDK 将不再免费用于商业用途。

运行Java 文件
我们可以避免编译阶段。我们可以在一个命令中编译执行。我们使用 java 命令。它将隐式编译而不保存 .class 文件。

Java 字符串方法
1) isBlank():如果字符串为空或仅包含空白代码点,则此方法返回true。

2) lines() :返回字符串流的引用,这些字符串是我们在按行拆分后收到的子字符串。

3) strip()、stripLeading() 和 stripTrailing :去除字符串开头、结尾和 remr 的空格。它是 trim() 的“Unicode-Aware”演变;

4) repeat():方法重复调用它的字符串接收到的次数。

在Lambda 表达式
中使用var 从Java 11 开始,我们可以在lambda 表达式中使用var 关键字。

在 lambda 表达式中使用 var 时,我们必须在所有参数上使用它,并且我们不能将它与使用特定类型混合使用。

基于嵌套的访问控制
在Java 11 之前,Java 允许类和接口相互嵌套。这些嵌套类型可以不受限制地相互访问,包括私有字段、方法和构造函数。

从 Java 11 开始,Class 类中有新方法可以帮助我们获取有关创建的嵌套的信息。这些方法包括以下内容:
getNestHost():返回此 Class 对象所属的嵌套的嵌套主机
getNestMembers():此返回一个数组,其中包含表示此 Class 对象所属的嵌套的所有成员的 Class 对象
isNestemateOf( ):这确定给定的 Class 是否是这个 Class 对象的 nestmate

Epsilon:无操作垃圾收集器
从 Java 11 开始,JVM 具有一项实验性功能,允许我们在没有任何实际内存回收的情况下运行 JVM。

目标是提供一个完全被动的垃圾收集器实现,具有有限的分配限制和尽可能低的延迟开销。

ZGC 可扩展低延迟GC
从Java 11 开始,我们可以使用ZGC。这个新的 GC 可作为实验性功能使用。
ZGC 是一个可扩展的低延迟垃圾收集器。它并发执行昂贵的工作,而不会停止应用程序线程的执行超过 10 毫秒。

HTTP Client
从Java 11 开始,HTTP Client API 更加标准化。新的 API 同时支持 HTTP/1.1 和 HTTP/2。新的 API 还支持 HTML5 WebSockets。

文件读写
Java 11 引入了两种新方法,可显着帮助从文件读取和写入字符串:
readString()writeString()

Flight Recorder
Flight Recorder 以前是Oracle JDK 中的商业插件,现在开源了,因为Oracle JDK 本身不再免费了。

JFR 是一种分析工具,用于从正在运行的 Java 应用程序收集诊断和分析数据。

它的性能开销可以忽略不计,通常低于 1%。因此它可以用于生产应用程序。

Java 12 最重要的特性和示例

Java 12 于 2019 年 3 月 19 日发布,这是六个月发布周期的一部分。
它是一个非 LTS 版本。因此它不会有长期支持。

JVM 变化
——Shenandoah 一种低暂停时间的垃圾收集器:Java 12 添加了 Shenandoah,这是一种实验性垃圾收集算法,通过在运行 Java 线程的同时执行疏散工作来减少垃圾收集暂停时间。

- 未使用的提交内存的提示返回:G1 在空闲时自动将 Java 堆内存返回给操作系统。当应用程序活动非常少时,会在合理的时间段内释放此内存。

-G1 的可中止混合收集:G1 效率的改进包括使 G1 混合收集在可能超过定义的暂停目标时可中止。这是通过将混合集合集拆分为强制性和可选性来完成的。

- 默认 CDS 档案:最终目标是通过生成类数据共享 (CDS) 档案来改进 JDK 构建过程。此功能的目标包括:
1) 缩短开箱即用的启动时间。
2) 无需运行 -Xshare: dump 即可从 CDS 中获益。

开关表达式
这个JEP 在Java 中开关有两个主要变化:
1) 引入case L -> 语法,不再需要break 语句,因为只执行-> 旁边的语句。
2)switch可以是一个表达式,所以它可以有一个值,也可以返回一个值。

File.mismatch 方法
Java 12 添加了以下方法来比较两个文件:

此方法返回第一个不匹配的位置,如果没有不匹配则返回 -1L。

紧凑型数字格式
Java 12 扩展了现有的数字格式 API,以提供对语言环境敏感的紧凑型数字格式的支持。
现在像 1000(例如)这样的数字可以格式化为“1K”(短式)或“1000”(长式)。

Teeing Collectors
Teeing Collector 是Streams API 中引入的新收集器实用程序。
这个收集器有三个参数——两个收集器和一个双函数。
所有输入值都传递给每个收集器,结果在 Bi-function 中可用。

Java 字符串新方法

1) java.lang.String :

-indent (int n):根据n的值调整此字符串每一行的缩进,并规范化行终止字符。

- 如果 n > 0,则在每行的开头插入 n 个空格 (U+0020)。
- 如果 n < 0,则从每行的开头删除最多 n 个空白字符。如果给定行不包含足够的空白,则删除所有前导空白字符。制表符也被视为单个字符。
- 如果 n = 0,则该行保持不变。但是,行终止符仍然是标准化的

- R transform (Function<? super String, ? extends R> f):此方法允许将函数应用于此字符串。

2)JVM常量API:

常量 API 方法对于正常的开发相关任务没有太多用处。

-Optional describeConstable():返回一个 Optional,其中包含此实例的标称描述符,即实例本身。

-String resolveConstantDesc (MethodHandles.Lookup lookup):将此实例解析为 ConstantDesc,其结果是实例本身。

#Java 13 个最重要的特性和示例#

Java 13 于 2019 年 9 月 17 日发布用于生产用途。由于 6 个月的发布周期,Java 13 中没有很多开发人员特定的功能。

开关表达式
我们最初在 JDK 12 中看到开关表达式。Java 13 的开关表达式在之前版本的基础上添加了新的 yield 语句。

文本
块 用于多行字符串的文本块,例如嵌入的JSON、XML、HTML 等。它使我们可以轻松地创建多行字符串。多行字符串必须写在一对三重双引号内。

早些时候,为了在我们的代码中嵌入 JSON,我们会将其声明为字符串文字:

现在,它可用于在我们的 Java 程序中轻松创建 HTML 和 JSON 字符串:

此外,java.lang.String 现在具有三种操作文本块的新方法:
1) formatted(Object ... args):它类似于 String format() 方法。添加它是为了支持使用文本块进行格式化。

2) stripIndent():用于去除文本块中每行开头和结尾的附带空白字符。此方法由文本块使用,它保留内容的相对缩进。

3) translateEscapes():返回一个字符串,其值为该字符串,转义序列被翻译成字符串文字。

动态CDS 归档
类数据共享(CDS) 一段时间以来一直是Java HotSpot VM 的一个显着特征。它允许在不同的 JVM 之间共享类元数据,以减少启动时间和内存占用。
现在,创建和使用 CDS 存档要容易得多。

ZGC:Uncommit Unused Memory
Z Garbage Collector 是Java 11 中引入的一种低延迟垃圾回收机制。它在堆内存清理之前增加了一个短暂的暂停时间。但是,未使用的内存并没有返回给操作系统。

从 Java 13 开始,ZGC 现在默认将未提交的内存返回给操作系统。

FileSystems.newFileSystem() 方法
FileSystems 类中添加了三个新方法,以便更轻松地使用文件系统提供程序,它将文件的内容视为文件系统:
-newFileSystem(Path)
-newFileSystem(Path, Map )
-newFileSystem(路径、映射、类加载器)

支持命名空间的 DOM 和 SAX 工厂
有一些新方法可以实例化支持命名空间的 DOM 和 SAX 工厂:
-newDefaultNSInstance()
-newNSInstance()
-newNSInstance(String factoryClassName, ClassLoader classLoader)

杂项更改
Java 13 给我们带来了一些更显着的更改:
-java.time – 添加了新的日本官方年号
-javax.crypto – 支持 MS 下一代密码术 (CNG)
-javax.security – 属性 jdk.sasl.disabledMechanisms添加以禁用 SASL 机制
-javax.xml.crypto – 引入了新的字符串常量来表示 Canonical XML 1.1 URI
-javax.xml.parsers – 添加了新方法来实例化具有命名空间支持的 DOM 和 SAX 工厂
-Unicode 支持升级到版本 12.1
-支持为 Kerberos 主体名称规范化和跨领域引用添加

Java 14 最重要的特性和示例

跟上六个月周期的传统,另一个非 LTS 版本 Java 14 计划于 2020 年 3 月 17 日发布。

Switch Expressions
Switch Expressions 在过去两个版本中保持预览功能后——Java 12 和 Java 13 终于在 Java 14 中获得了永久地位。

instanceof 的模式匹配
将一种类型强制转换为另一种类型的旧方法是:

新方法是:

在上面的代码中,只有当 obj 是 Journaldev 类型时,实例 jd 才会被赋值。变量的范围仅限于条件块。

有用的 NullPointerExceptions
改进了 JVM 生成的 NullPointerExceptions 异常消息。

在 Java 14 之前:

Java 14 引入了一个新的 JVM 特性,它通过更具描述性的堆栈提供更好的洞察力,如下所示:

记录
我们需要编写大量低价值、重复的代码来负责任地编写一个简单的数据载体类:构造函数、访问器、equals()、hashCode()、toString()等。为了避免这些重复代码,Java是计划使用记录。

在 Java 14 之后:

此外,我们可以通过以下方式向记录添加其他字段、方法和构造函数:

关于 Records 需要注意的几件重要事情:
- 记录既不能扩展一个类,也不能被另一个类扩展。这是最后一节课。
- 记录可以实现接口。
- 记录支持多个构造函数。
- 记录允许修改访问器方法。
-记录不能是抽象的。
-Records 不能扩展任何其他类,也不能在主体内定义实例字段。实例字段必须仅在状态描述中定义。
-声明的字段是私有的和最终的。
- 记录的主体允许静态字段和方法。

文本块
文本块作为预览功能在 Java 13 中引入,目的是允许轻松创建多行字符串文字。它有助于轻松创建 HTML 和 JSON 或 SQL 查询字符串。

在 Java 14 中,文本块仍处于预览状态,并添加了一些新内容:
- 用于显示漂亮的多行字符串块的反斜杠。
-\s 用于考虑编译器默认忽略的尾随空格。它保留了它之前的所有空间。

Foreign-Memory Access API
Java 14 JDK 将引入一个有效的Java API,使Java 应用程序能够安全高效地访问存储在Java 堆外的外部内存。外部内存访问 API 引入了三个主要抽象:MemorySegment、MemoryAddress 和 MemoryLayout。

Java 15 最重要的特性和示例

Java 15 (Java SE 15) 及其 Java 开发工具包 15 (JDK 15) 开源已于 2020 年 9 月 15 日发布。

密封类
密封类在Kotlin 中已经有一段时间了,Java 15 终于引入了这个特性以更好地控制继承。
可以使用
sealed修饰符来密封一个类。

因此,上面的代码意味着,只有在关键字permits之后定义的类才允许扩展 Vehicle 密封类。

每个允许的类都必须设置一个显式修饰符。它可以是 final 或 sealed 或 non-sealed :
-声明为 final 的允许子类不能进一步扩展。
- 声明为密封的允许子类可以进一步扩展,但只能由子类允许的类扩展。
- 允许的子类可以声明为非密封的,可以由任何类进一步扩展。超类不能进一步限制该类层次结构中的子类。

隐藏类
虽然大多数开发人员不会从中发现直接好处,但使用动态字节码或 JVM 语言的任何人都可能会发现它们很有用。

隐藏类的目标是允许在运行时创建不可发现的类。

诸如此类的类通常具有较短的生命周期,因此,隐藏类被设计为高效加载和卸载。

Foreign Memory API
Foreign memory access 已经是 Java 14 的孵化特性。在 Java 15 中,目标是继续其孵化状态,同时添加几个新特性:
- 新的 VarHandle API,用于自定义内存访问 var handles
- 支持并行使用 Spliterator 接口处理内存段 -增强
对映射内存段的
支持 - 能够操作和取消引用来自本地调用之类的地址

垃圾收集器
在Java 15 中,ZGC 和Shenandoah 都将不再是实验性的。两者都将是团队可以选择使用的受支持配置,而 G1 收集器将保持默认设置。

Nashorn JavaScript 引擎
值得注意的是,最初在 Java 8 中引入的 Nashorn JavaScript 引擎现已被删除。随着最近引入 GraalVM 和其他 VM 技术,很明显 Nashorn 在 JDK 生态系统中不再占有一席之地。

结论

本文介绍了 Java 从 Java 8 到 Java 15 的演变。

自 Java 8 于六年前发布以来,Java 作为一种语言和生态系统已经发生了巨大的变化,通过添加许多新功能帮助使 Java 成为与其他基于 JVM 的竞争对手相比具有竞争力的选择。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码