Java 14 新功能介绍

Java 14 新功能介绍

java 14, 图片来自 medium.com

Java 14 早在 2019 年 9 月就已经发布,虽然不是长久支持版本,但是也带来了不少新功能。

Java 14 官方下载:https://jdk.java.net/archive/

Java 14 官方文档:https://openjdk.java.net/projects/jdk/14/

Java 14 新功能:

立即学习“Java免费学习笔记(深入)”;

305:instanceof 类型判断(预览)343:打包工具(孵化)345:G1 支持 NUMA(非统一内存访问)358:更有用的 NullPointerExceptions359:Records (预览)361:Switch 表达式 (标准)362:废弃对 Solaris 和 SPARC 端口支持363:移除 CMS 垃圾收集器364:macOS 的 ZGC365:Windows 的 ZGC366:弃用 ParallelScavenge + SerialOld GC 组合367:删除 Pack200 Tools 和 API368:文本块 (二次预览)370:Foreign-Memory Access API (Incubator)349:JFR Event Streaming352:Non-Volatile Mapped Byte Buffers

注意: 如果一个功能为预览版,那么在编译和运行时需要打开预览功能。

代码语言:javascript代码运行次数:0运行复制

./javac --enable-preview --release 14 Test.java./java --enable-preview Test

1. JEP 305:instanceof 类型判断(预览)

在 Java 14 之前,使用 instanceof 进行类型判断之后,需要进行对象类型转换后才能使用。

代码语言:javascript代码运行次数:0运行复制

package com.wdbyte;import java.util.ArrayList;import java.util.List;public class Java14BeaforInstanceof {    public static void main(String[] args) {        Object obj = new ArrayList();        if (obj instanceof ArrayList) {            ArrayList list = (ArrayList)obj;            list.add("www.wdbyte.com");        }        System.out.println(obj);    }}

而在 Java 14 中,可以在判断类型时指定变量名称进行类型转换,方便了使用。

代码语言:javascript代码运行次数:0运行复制

package com.wdbyte;import java.util.ArrayList;public class Java14Instanceof {    public static void main(String[] args) {        Object obj = new ArrayList();        if (obj instanceof ArrayList list) {            list.add("www.wdbyte.com");        }        System.out.println(obj);    }}

可以看到,在使用 instanceof 判断类型成立后,会自动强制转换类型为指定类型。

输出结果:

代码语言:javascript代码运行次数:0运行复制

[www.wdbyte.com]

这个特性在 Java 14 中还是预览功能,在 Java 16 中正式转正。

2. JEP 343:打包工具(孵化)

在 Java 14 中,引入了打包工具,命令是 jpackage,使用 jpackage 命令可以把 JAR 包打包成不同操作系统支持的软件格式。

代码语言:javascript代码运行次数:0运行复制

jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main

常见平台格式如下:

Linux: deb and rpmmacOS: pkg and dmgWindows: msi and exe

要注意的是,jpackage 不支持交叉编译,也就是说在 windows 平台上是不能打包成 macOS 或者 Linux 系统的软件格式的。

3. JEP 345:G1 支持 NUMA(非统一内存访问)

G1 收集器现在可以感知 NUMA 内存分配方式,以提高 G1 的性能,可以使用 +XX:+UseNUMA 启用这项功能。

4. JEP 358:更有用的 NullPointerExceptions

NullPointerException 一直都是一个比较常见的异常,但是在 Java 14 之前,如果一行有多个表达式时,这时报了空指针后,单纯的从报错信息来看,可能并不知道是哪个对象为 NULL ,下面是一个演示。

代码语言:javascript代码运行次数:0运行复制

package com.wdbyte;public class Java14NullPointerExceptions {    public static void main(String[] args) {        String content1 = "www.wdbyte.com";        String content2 = null;        int length = content1.length() + content2.length();        System.out.println(length);    }}

在 Java 14 之前,从下面的报错中我们只能得到错误出现的行数,但是并不能确定是 conteng1 还是 content2null

代码语言:javascript代码运行次数:0运行复制

Exception in thread "main" java.lang.NullPointerException at com.alibaba.security.astralnet.console.controller.ApiChartsTest.main(Java14NullPointerExceptions.java:8)

但是在 Java 14 中,会清晰的告诉你 because "content2" is null

代码语言:javascript代码运行次数:0运行复制

Exception in thread "main" java.lang.NullPointerException:  Cannot invoke "String.length()" because "content2" is null at com.wdbyte.Java14NullPointerExceptions.main(Java14NullPointerExceptions.java:8)

5. JEP 359:Records (预览)

record 是一种全新的类型,它本质上是一个 final 类,同时所有的属性都是 final 修饰,它会自动编译出 public get hashcodeequalstoString 等方法,减少了代码编写量。

示例:编写一个 Dog record 类,定义 name 和 age 属性。

代码语言:javascript代码运行次数:0运行复制

package com.wdbyte;public record Dog(String name, Integer age) {}

Record 的使用。

AI新媒体文章 AI新媒体文章

专为新媒体人打造的AI写作工具,提供“选题创作”、“文章重写”、“爆款标题”等功能

AI新媒体文章 75 查看详情 AI新媒体文章 代码语言:javascript代码运行次数:0运行复制

package com.wdbyte;public class Java14Record {    public static void main(String[] args) {        Dog dog1 = new Dog("牧羊犬", 1);        Dog dog2 = new Dog("田园犬", 2);        Dog dog3 = new Dog("哈士奇", 3);        System.out.println(dog1);        System.out.println(dog2);        System.out.println(dog3);    }}

输出结果:

代码语言:javascript代码运行次数:0运行复制

Dog[name=牧羊犬, age=1]Dog[name=田园犬, age=2]Dog[name=哈士奇, age=3]

这个功能在 Java 15 中进行二次预览,在 Java 16 中正式发布。

6. JEP 361:Switch 表达式 (标准)

Switch 表达式改进从 Java 12 就已经开始了,Java 12 让 switch 支持了 L-> 语法,Java 13 引入了 yield 关键词用于返回结果,但是在 Java 12 和 13 中功能都是预览版的,而在 Java 14 中,正式转正。

代码语言:javascript代码运行次数:0运行复制

// 通过传入月份,输出月份所属的季节public static String switchJava12(String month) {     return switch (month) {        case "march", "april", "may"            -> "春天";        case "june", "july", "august"           -> "夏天";        case "september", "october", "november" -> "秋天";        case "december", "january", "february"  -> "冬天";        default -> "month erro";    };}// 通过传入月份,输出月份所属的季节public static String switchJava13(String month) {    return switch (month) {        case "march", "april", "may":            yield "春天";        case "june", "july", "august":            yield "夏天";        case "september", "october", "november":            yield "秋天";        case "december", "january", "february":            yield "冬天";        default:            yield "month error";    };}

7. JEP 368:文本块(二次预览)

文本块是 Java 13 引入的语法,在 Java 14 中对其进行了增强。文本块依旧是预览功能,这次更新增加了两个转义符。

结尾不换行s 表示一个空格

示例:文本块体验

代码语言:javascript代码运行次数:0运行复制

String content = """        {            "upperSummary": null,            "sensitiveTypeList": null,            "gmtModified": "2011-08-05s10:50:09",        }         """;System.out.println(content);

输出结果:

代码语言:javascript代码运行次数:0运行复制

{    "upperSummary": null,    "sensitiveTypeList": null,    "gmtModified": "2011-08-05 10:50:09",}

文本块功能在 Java 15 中正式发布。

其他更新

JEP 362:废弃对 Solaris 和 SPARC 端口支持

从 Java 14 开始,放弃对 Solaris/SPARC, Solaris/x64, 和 Linux/SPARC 端口的支持,放弃一部分开发这势必会加快 Java 整体的开发节奏。

相关阅读:https://openjdk.java.net/jeps/362

JEP 363:移除 CMS 垃圾收集器

移除对 CMS(Concurrent Mark Sweep) 垃圾收集器的支持,其实早在 Java 9 就开始移除 CMS 垃圾收集器了,只不过在 Java 14 中被正式删除。

JEP 364:macOS 上的 ZGC(实验性)

Java 11 在 Linux 上引入了 Z 垃圾收集器 (ZGC),现在它可以移植到 macOS。

JEP 365:Windows 上的 ZGC(实验性)

Java 11 在 Linux 上引入了 Z 垃圾收集器 (ZGC),现在它可以移植到 Windows 上(版本大于 1803)。

JEP 366:弃用 ParallelScavenge + SerialOld GC 组合

由于使用场景不多,维护工作太大,废弃之。相关阅读:https://openjdk.java.net/jeps/366

JEP 367:删除 Pack200 工具和 API

参考https://openjdk.java.net/projects/jdk/14/https://openjdk.java.net/jeps/366https://openjdk.java.net/jeps/362

以上就是Java 14 新功能介绍的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/482948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 12:14:16
下一篇 2025年11月8日 12:15:01

相关推荐

  • LAMP项目间歇性无法访问,如何快速排查并解决?

    排查LAMP项目间歇性无法访问的有效方法 许多开发者都遇到过LAMP项目间歇性无法访问的难题,表现为应用时而正常,时而无法连接,同时netstat -a命令显示大量TIME_WAIT连接。本文将提供高效的排查和优化策略。 此类问题并非简单的端口冲突或配置错误,而是可能源于LAMP环境或应用代码。 第…

    2025年12月10日
    000
  • 如何在Laravel中高效批量插入数据并应用Model属性?

    在Laravel中高效批量插入数据并充分利用Model属性 Laravel的insert()方法虽然简便,但无法应用Model的属性修改器、获取器和驼峰命名转换,这在需要数据处理或规范化的场景下限制了其功能。如何优雅地批量插入数据并同时利用Eloquent ORM的优势呢? 关键在于平衡批量插入效率…

    2025年12月10日
    000
  • 如何使用PHP对二维数组进行排序并添加排名?

    本文介绍如何使用php对二维数组进行排序并添加排名。我们将以一个包含票号(xuhao)和票数(piaoshu)信息的二维数组为例,演示如何根据票数降序排序(票数相同则按票号升序),并为每个子数组添加排名(paiming)字段。 初始数组: $data = array( array(“xuhao” =…

    2025年12月10日
    000
  • Laravel数据库迁移类名冲突如何解决?

    Laravel数据库迁移中类名冲突的有效解决方法 在使用Laravel框架进行数据库迁移时,可能会遇到令人困扰的类名冲突错误,通常表现为“类已定义”的报错信息。这通常发生在项目中存在多个定义相同的类名,且缺乏命名空间区分的情况下。本文针对“每次迁移都生成新的类文件,且无命名空间导致类名重复”的问题,…

    2025年12月10日
    000
  • Windows 11下PHP和前端开发:WSL2还是Docker更适合?

    在 windows 11 系统下,选择 wsl2 还是 docker 作为 php 和前端开发环境更合适? 这个问题的核心在于选择一个合适的开发环境来运行 PHP 和前端项目,并兼顾开发效率和便捷性。目前,提问者使用 Docker 容器,并在其中安装了宝塔面板以及相关的 PHP、MySQL 等环境,…

    好文分享 2025年12月10日
    000
  • ThinkPHP5中app_init行为监听:代码该放在哪里才能生效?

    ThinkPHP5框架中app_init行为监听详解 在学习ThinkPHP5时,许多开发者会遇到app_init行为监听的难题。ThinkPHP5文档提及可在app_init位置监听行为,但实际操作并非直观。本文将详细阐述如何在ThinkPHP5中有效监听app_init行为。 开发者常使用thi…

    2025年12月10日
    000
  • PHP原生PDO执行多条SQL语句插入数据时如何避免语法错误?

    PHP原生PDO多语句执行及语法错误排查 在使用PHP原生PDO操作MySQL数据库时,经常需要执行多条SQL语句。然而,如果操作不当,很容易出现语法错误,导致程序异常。本文将分析一个常见的错误,并提供解决方案。 问题描述: 用户尝试用单条SQL语句同时修改表结构并插入数据,代码如下: 立即学习“P…

    2025年12月10日
    000
  • Dcat Admin表单多行布局下,radio单选按钮联动失效怎么办?

    Dcat Admin表单联动功能,尤其在多行布局下,可能存在一些实现上的难点。本文将分析如何在Dcat Admin的多行表单中实现radio单选按钮的联动,并解决“Dcat Admin表单多行布局下,radio单选按钮联动失效”的问题。 文中提供的代码片段尝试在多行布局中使用radio组件和when…

    2025年12月10日
    000
  • HTML表单onsubmit事件无效:如何排查表单提交前验证失效的原因?

    HTML表单onsubmit事件失效的排查与解决 在HTML表单中,onsubmit事件用于在表单提交前执行验证。然而,有时onsubmit=”return check();”语句却无法阻止表单提交。本文分析此问题可能的原因并提供解决方案。 问题描述: onsubmit事件失效,表单仍然提交到目标页…

    2025年12月10日
    000
  • FastAdmin框架下POST请求:JSON数据保存失败的原因是什么?

    FastAdmin框架下ThinkPHP POST请求JSON数据保存到MySQL数据库失败的排查与解决 在使用FastAdmin框架结合ThinkPHP进行POST请求时,将JSON数据保存到MySQL数据库遇到问题:$paif_data变量和$str变量打印结果一致,但使用paiflib::su…

    2025年12月10日
    000
  • 如何用PHP和CURL高效采集新闻列表及详情?

    本文将阐述如何利用PHP和cURL高效抓取目标网站的新闻列表和新闻详情,并展示最终结果。 关键在于高效运用cURL获取数据,处理相对路径并提取所需信息。 首先,解决第一个挑战:从列表页(例如,页面1)提取新闻标题和完整URL。 代码示例如下: <?php$url = 'http://…

    2025年12月10日
    000
  • HTML表单onsubmit事件失效,如何排查表单验证问题?

    HTML表单提交验证失效:排查与解决 在使用HTML表单进行数据提交时,onsubmit事件常用于客户端验证,确保数据符合要求后再提交至服务器。然而,onsubmit事件有时失效,导致表单直接提交,本文将分析一个案例,解决onsubmit=”return check()”失效的问题。 问题描述: 用…

    2025年12月10日
    000
  • 苹果M1芯片Mac上编译安装Redis失败怎么办?

    苹果m1芯片mac编译安装redis失败的排查与解决 在苹果M1芯片的Mac电脑上编译安装Redis,常常会遇到各种问题,例如编译失败等。本文将指导您如何有效地排查和解决这些问题。 很多用户反馈编译错误,但仅提供截图不足以诊断问题。 为了高效解决,务必提供完整的错误日志文本。 以下几个关键点需要关注…

    2025年12月10日
    000
  • PHP PDO连接远程MySQL数据库:php.ini配置需要修改吗?

    PHP PDO连接远程MySQL数据库:关于php.ini配置的常见误区 许多PHP开发者在使用PDO连接远程MySQL数据库时,常常误认为需要修改php.ini文件。本文将对此进行详细解释,并消除一些常见的误解。 在Linux环境下,开发者可能会发现php.ini中关于PDO的配置项很少,主要涉及…

    2025年12月10日
    000
  • Dcat Admin表单多行布局下,Radio单选按钮如何实现联动?

    Dcat Admin表单多行布局下Radio单选按钮联动解决方案 在Dcat Admin框架下构建表单时,实现表单元素联动,例如根据单选按钮(Radio)的选择动态显示或隐藏其他字段,经常会遇到问题,尤其是在多行布局下。本文将解决Dcat Admin多行布局中Radio单选按钮联动失效的问题。 问题…

    2025年12月10日
    000
  • Laravel数据库迁移报错:类名重复如何解决?

    Laravel数据库迁移:巧妙解决类名冲突 在使用Laravel框架进行数据库迁移时,可能会遇到令人头疼的类名重复错误,通常表现为执行php artisan migrate命令时报错,提示类名已存在。 这通常是因为项目中存在多个同名迁移文件,且未采用命名空间进行区分。 本文将提供一种高效的解决方案,…

    2025年12月10日
    000
  • Redis Cluster主节点宕机IP变化:PHP客户端如何优雅应对?

    PHP客户端应对Redis Cluster主节点宕机及IP变化 在Redis Cluster集群中,主节点故障和主从切换是常见事件。然而,新主节点的IP地址可能与旧主节点不同,这给PHP客户端连接带来挑战。本文探讨使用phpredis的RedisCluster类时,如何优雅地处理此类情况。 问题: …

    2025年12月10日
    000
  • 微信公众号分享卡片信息缺失:新域名下分享失败怎么办?

    微信公众号分享调试:新域名下卡片信息缺失的解决方法 本文解决一个微信公众号个人订阅号网页分享问题:开发者使用个人订阅号AppID和密钥配置网站JSSDK微信分享功能,已添加JS安全域名,并确认拥有access_token和分享接口调用权限。旧域名分享正常,但新域名分享的微信卡片却缺少描述和图片,ti…

    2025年12月10日
    000
  • Beego项目中如何访问main函数定义的全局变量?

    在Beego项目中,如何正确访问main函数中定义的全局变量?本文将详细讲解如何在Go语言的Beego框架中,从非main.go文件(例如controllers目录下的文件)访问在main.go文件中定义的全局变量。对于Go语言新手来说,这个问题常常令人困惑。 问题背景:假设您需要在一个Beego项…

    2025年12月10日
    000
  • 正则表达式环视、断言和预查:如何正确理解和使用它们?

    深入理解正则表达式环视、断言和预查 本文旨在深入探讨正则表达式中环视(Lookaround)、断言和预查的应用技巧,并澄清一些常见的误解,尤其关注位置选择对匹配结果的影响。 某些文章中,使用 ^(?!baidu).*$ 来判断非“baidu”开头的字符串,以及 ^.*?(? 判断非“com”结尾的字…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信