Java 12 与Java 13 新特性预览:Switch表达式、GC新垃圾回收算法、低延时GC、ZGC改进等

简介: Java 12 与Java 13 新特性预览:Switch表达式、GC新垃圾回收算法、低延时GC、ZGC改进、文本块等

Java JDK 13于9月17日发布,Java JDK 12于3月19日发布,现在Java的更新速度非常快,每6个月发布一个新的Java版本。
在这个文章里,我们一起详细学习Java 12与Java 13新特性的新功能。
当然现在统计数据来看,绝大部分企业还是Java 8,不会冒险升级,作为企业应用开发,Java8也足够了。
另外企业不用担心Oracle 版本的JDK收费问题。之前的文章也做过介绍。只要我们使用Open JDK代替Oracle JDK就可以了。
我们先来看看Java 12的新特性有哪些?然后再来看看Java 13的新特性有哪些。
image
1、Java 12 新特性
对于Java JDK 12 新API功能并不多。大多数增强功能都是内部Java/JVM改进,直接面向Java开发人员的比如Switch语法糖,还有性能测试工具,其他的基本的内部改进,大家做必要的了解即可。
下面是Java 12 的新特性列表:
(1)JEP 325 – Switch 表达式 (预览): 扩展switch语法,以便可以用作语句或表达式,并且两个表单都可以使用“传统”或“简化”作用域和控制流行为。 这些更改将简化日常编码开发工作,并为在交换机中使用模式匹配(JEP 305)做好准备。
(2)JEP 344 – G1可终止混合垃圾回收模式: 如果混合垃圾回收超时,允许终止垃圾回收工作,避免过久的垃圾回收影响性能。
(3)JEP 346 – G1立即返回可未使用已经提交的内存: 增强G1 garbage collector,可以立即返回空闲的Java对内存。
(4)JEP 189 – Shenandoah, 低延迟GC (实验性): 添加新的垃圾收集(GC)算法,通过与正在运行的Java线程同时进行回收工作来减少GC暂停时间。
(5)JEP 230 – 微性能测试套件Microbenchmark Suite: 在JDK源代码中添加一套基本的微基准测试工具,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试工具。
(6)JEP 334 – JVM Constants API: 新增了一个API来模拟关键类文件和运行时工件的名义描述,特别是可以从常量池加载的常量.
(7)JEP 340 – 统一AArch64 Port: 删除与arm64端口相关的所有源代码,同时保留32位ARM端口和64位aarch64端口。
(8)JEP 341 – 默认CDS归档: 在64位平台上使用默认类列表增强JDK构建过程以生成类数据共享(CDS)归档。

此外,JEP 326 - Raw String Literals新特性已从JDK12中移除。但是,此JEP中有2个新的String方法包含在JDK12中。
2、Java 13 新特性

JDK 13 此版本将是Java SE平台版本13的参考实现,由Java Community Process中的JSR 388指定。

(1)350:Dynamic CDS Archives 动态CDS存档。扩展应用程序类 - 数据共享( application class-data sharing),以允许在Java应用程序执行结束时动态归档类。 归档类将包括默认的基础层CDS存档中不存在的所有已加载的应用程序类和库类。
(2)351:ZGC: 增强ZGC以将未使用的堆内存返回给操作系统。
(3)353:重新实现旧版套接字API:维护和调试的更简单,新代码替换java.net.Socket和java.net.ServerSocket API的底层实现。 新的实现很容易适应用户模式线程threads。
(4)354:Switch 表达式(预览):JDK12继续迭代。
(5)355:Text Blocks文本块 (预览):将文本块添加到Java语言。 文本块是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
3、新特性例子代码
下面来看看Java12新特性语法的,
3.1 Switch表达式 (JEP 325)
Switch表达式添加了两个新功能:
引入case value -> 语法,消除了对break语句的需要。
现在我们可以将一个Switch表达式赋给变量,以将其作为方法的值返回。可以在下面的代码中看到这些新功能。
让我们从编写传统的switch语句开始,比如判断996工作上班时间的代码:

String result;
switch (dayOfWeek) {
        case “星期一”:
        case “星期二”:
        case “星期三”:
        case “星期四”:
        case “星期五”:
            result = "上班";
            break;
        case “星期六”:
            result = "加班";
            break;
        case “星期日”:
            result = "休息";
            break;
        default:
            result = "加班!";
    }
    return result
AI 代码解读

全新的语法,非常简单,也使用了新的语法Lamda表达式:

    String result;
    switch (dayOfWeek) {
        case “星期一”, “星期二”, “星期三”, “星期四”, “星期五” -> result = "上班";
        case “星期六” -> result = "加班";
        case “星期日” -> result = "休息";
        default -> result = "加班!";
    }
    return result;
AI 代码解读

3.2 文本块(JEP 355) - Text Blocks
这个是JDK 13中新增的功能。随着文本块Text Block的引入,即多行字符串文字,字符串可以跨越几行代码,同时避免常见情况下的转义序列。 它还增强了Java程序中的字符串可读性。这个还是比较方便的,语法很简单。

// 文本块Text Block
String textBlock = """
这是Java13新特性 文本块测试;
这是Java13新特性 文本块测试;
这是Java13新特性 文本块测试;
这是Java13新特性 文本块测试;
这是Java13新特性 文本块测试;
            """;
AI 代码解读

这种改进基本属于语法糖的层面。

3.3 动态CDS归档JEP 351 - Dynamic CDS(Class-Data Sharing) Archiving
CDS的功能在进化一步,就是动态CDS功能。说白了,可以在运行期间动态保存类数据,也就是所谓的归档。
应用程序class-data Sharing(AppCDS)再JDK13新版本里已经简化。 在应用程序退出时,可以动态存档类数据。 动态生成的归档文件将在与正在运行的JDK映像一起打包的默认系统归档文件上创建生成,并保存数据。
我们可以使用选项参数-XX:ArchiveClassesAtExit = 控制程序再退出时生成存档。 也可以:SharedArchiveFile = ,来使用动态存档功能。

# 创建存档文件
% bin/java -XX:ArchiveClassesAtExit=helloworld.jsa -cp helloworld.jar Hello

# 使用存档文件
% bin/java -XX:SharedArchiveFile=hello.jsa -cp helloworld.jar Hello

# 使用动态存档,在老文档基础上
% bin/java -XX:SharedArchiveFile=<base archive>:helloworld.jsa -cp helloworld.jar Hello
AI 代码解读

总结
Java 13即将于2019年9月17日发布。第二个候选版本已经于2019年8月22日发布。
我们详细介绍了Java12和13中引入的新功能,并给出了一些关键特性的代码实例。
OpenJDK 13中也将引入相同的功能。
注意生产环境,尽量使用Open JDK,学习使用可以了。正式项目,仔细评估,不到万不得已,推荐使用成熟、稳定的Java 8版本。
阿里招聘Java开发、架构师、专家、PD、市场经理等职位。

参考资料:
https://openjdk.java.net/projects/jdk/12
https://openjdk.java.net/projects/jdk/13
https://www.technolush.com/blog/whats-new-in-java-13

徐雷简介:
1)MongoDB中文社区联席主席;
2)《MongoDB实战》第2版译者;
3)阿里云大学讲师;阿里云栖社区讲师;
4)目前就职于阿里巴巴,架构师。

image
阿里巴巴Java群超过4800人
进群方式:钉钉扫码入群

目录
相关文章
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
84 15
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
78 16
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
65 32
|
1月前
|
Java中的控制流语句:if、switch、for、foreach、while、do-while
Java中的控制流语句包括条件判断语句 `if`和 `switch`,以及循环语句 `for`、增强型 `for`(`foreach`)、`while`和 `do-while`。这些语句提供了灵活的方式来控制程序的执行流程,确保代码逻辑清晰且易于维护。掌握这些基本语法,对于编写高效和可读的Java程序至关重要。
64 15
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
68 6
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
53 5
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等