Java 18 正式发布,默认 UTF-8,finalize 被弃用,别再乱用了!

JDK 18 正式发布

JDK 17 刚发布半年,JDK 18 又如期而至,JDK 版本号这算是成年了?

JDK 18 发布了,栈长继续为大家解读!

e1d7a6e4e99230f6eac00ad8950814e2.png16b03ea1216151713cb596e940005afd.png

JDK 18 延续了 JDK 17 开创的免费策略,但,JDK 18~20 不是长期支持版本,注意不要用在生产。

最新 Oracle Java 支持路线图:

b2f9f69b575c036a813ad2ab81201447.png

JDK 18 新特性一览

ID特性说明
1400:UTF-8 by Default默认 UTF-8
2408:Simple Web Server简单 Web 服务器
3413:Code Snippets in Java API Documentation简化文档代码片段
4416:Reimplement Core Reflection with Method Handles重新实现反射核心机制
5417:Vector API (Third Incubator)矢量 API(三次孵化中)
6418:Internet-Address Resolution SPI互联网地址解析 SPI
7419:Foreign Function & Memory API (Second Incubator)外部函数和内存 API(二次孵化中)
8420:Pattern Matching for switch (Second Preview)switch 模式匹配(二次预览中)
9421:Deprecate Finalization for Removal弃用 Finalization

JDK 18 这个版本提供了 9 个增强功能,栈长接下来为大家一一解读。

关注公众号Java技术栈,持续分享最新、最主流的Java技术~

JDK 18 新特性详细介绍

1、400:UTF-8 by Default

默认 UTF-8

没错,将 UTF-8 指定为标准 Java API 的默认字符集。

在 JDK 17 及更早版本中,默认字符集是在 Java 虚拟机运行时才确定的,取决于不同的操作系统、区域设置等因素,因此存在潜在的风险。

从这个版本开始,依赖于默认字符集的 API 会在所有实现、操作系统、语言环境和配置中保持一致。

可以使用以下命令查看当前 JDK 的默认字符集:

java -XshowSettings:properties -version 2>&1 | grep file.encodingfile.encoding = UTF-8file.encoding.pkg = sun.io

在 JDK 中通过下面 API 获取当前 JDK 的默认字符集:

Charset.defaultCharset()

我们都知道字符集一致的重要性,所有地方默认字符集保持一致真的非常有用。

2、408:Simple Web Server

简单 Web 服务器

提供一个命令行工具启动的迷你 Web 服务器:

$ jwebserver
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving /cwd and subdirectories on 127.0.0.1 port 8000
URL: http://127.0.0.1:8000/

只限于静态文件,类似于 Apache、Nginx 的静态服务器功能,不过它要更简单,功能极少,设置简单。

简单的、临时的测试用用我觉得还行,不用去额外下载和配置其他的服务器组件,以后用 Java 就能搞定了,有兴趣的可以研究试用下!

3、413:Code Snippets in Java API Documentation

Java API 文档中支持 Snippets 代码片段

增加了 @snippet 标签,简化 API 文档中包含示例源代码的情况。

使用语法:

{@snippet ...}

以前是这样写的:

/*** <pre>{@code*     String[] y = x.toArray(new String[0]);* }</pre>**/

JDK 18 中可以这样:

/*** The following code shows how to use {@code Optional.isPresent}:* {@snippet :* if (v.isPresent()) {*     System.out.println("v: " + v.get());* }* }*/

4、416:Reimplement Core Reflection with Method Handles

重新实现反射核心机制(Method Handles)

JDK 18 使 Method Handles 作为反射的底层机制,重新实现了 java.lang.reflect.Method、Constructor、Field 组件,将大大降低反射 API 的维护和开发成本。

另外,最新最全的 Java 面试题整理好了,大家可以在Java面试库小程序在线刷题。

5、417:Vector API (Third Incubator)

矢量 API(三次孵化中)

Vector API 这是一个新的初始迭代孵化器模块,模块包:jdk.incubator.vector,用于表示在运行时可靠地编译到支持的 CPU 架构上的最佳矢量硬件指令的矢量计算,矢量运算可以提供优于等效标量计算的性能,并且在机器学习、人工智能和密码学等领域非常普遍。

本次增强的 API 允许以一种在运行时,可靠地编译为支持的 CPU 架构上的最佳向量指令的方式表达向量计算。

下个版本会转正吗?

6、418:Internet-Address Resolution SPI

互联网地址解析 SPI

定义了一个全新的 SPI(service-provider interface),用于主要名称和地址的解析,以便 java.net.InetAddress 可以使用平台之外的第三方解析器。

7、JEP 419: Foreign Function & Memory API (Second Incubator)

外部函数和内存 API(二次孵化中)

改进了 JDK 14 和 JDK 15 引入的 API,通过有效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存(JVM 之外的内存),这些 API 可以调用本地库和处理本地数据,与 Java 运行环境之外的代码和数据进行交互。

8、JEP 420: Pattern Matching for switch (Second Preview)

switch 模式匹配(二次预览中)

instanceof 模式匹配的概念大家都清楚吧?不清楚的可以看下这篇文章:Java 14 之模式匹配,非常赞的一个新特性!

这次在 JDK 17 中为 switch 语句支持模式匹配,是个什么鬼?来看下面的示例!

老代码写法:

static String formatter(Object o) {String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d", i);} else if (o instanceof Long l) {formatted = String.format("long %d", l);} else if (o instanceof Double d) {formatted = String.format("double %f", d);} else if (o instanceof String s) {formatted = String.format("String %s", s);}return formatted;
}

模式匹配新写法:

static String formatterPatternSwitch(Object o) {return switch (o) {case Integer i -> String.format("int %d", i);case Long l    -> String.format("long %d", l);case Double d  -> String.format("double %f", d);case String s  -> String.format("String %s", s);default        -> o.toString();};
}

牛逼,直接在 switch 上支持 Object 类型,这就等于同时支持多种类型,使用模式匹配得到具体类型,大大简化了语法量,这个功能还是挺实用的,期待转正,栈长会再详细写一篇,关注公众号:Java技术栈,公众号第一时间推送哦。

往期 Java 新特性教程可以去Java技术栈博客:

https://www.javastack.cn/categories/Java/

9、JEP 421: Deprecate Finalization for Removal

弃用 Finalization

如现在使用 finalize 方法:

1679d3950e81813f3ae4a90c11bfdc4d.png

已经标识为废弃状态了。。

finalize 大家应该都很清楚吧!

它可以帮助我们主动释放系统底层资源,说实话,没用过,Java 是自动管理内存的,使用它反而会导致潜在的系统安全风险,没帮助不说反而是负担,所以计划移除了。

Finalization 现在默认是开启的,但可以通过下面参数进行禁用:

--finalization=disable

后续的版本会默认禁用,再逐步进行彻底删除,我估计在下一个长期支持版本 JDK 21 中会彻底删除。

不要再用 finalize 了,以后面试问 finalize 和 final、finally 的区别也要好好回答了。

可以考虑使用其他的资源管理技术,如:try-with-resources(JDK 7+) 和 cleaners(JDK 9+),关于这块栈长会再详细写一篇,关注公众号:Java技术栈,公众号第一时间推送哦。

总结

本文主要介绍了 JDK/Java 18 的 9 个新特性基本面,虽然现在用不上,但了解和学习还是很有必要的,技术更新太快,不进则退。

另外,据最近的调查显示,市面上的主流版本还是 JDK 8,其实是 JDK 11,但现在随着 JDK 17+ 的免费,JDK 8 会逐渐被替代,JDK 17+ 会成为下一代主流版本。

d4cea9815ec8b0c3f060be8f1768182f.gif

往期推荐

664456d45e7ad656e3b284b75275b1b3.png

MySQL 精选 60 道面试题(含答案)


45e18129d2f03ad34570b965d1bf0915.png

SpringCloud Ribbon中的7种负载均衡策略!


73e42e908b417774b29d2a43b6363e0b.png

SpringCloud OpenFeign + Nacos正确打开方式!


68e065e45490d99f5c917b81c5875c73.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring官方推荐的@Transactional还能导致生产事故?

在Spring中进行事务管理非常简单&#xff0c;只需要在方法上加上注解Transactional&#xff0c;Spring就可以自动帮我们进行事务的开启、提交、回滚操作。甚至很多人心里已经将Spring事务与Transactional划上了等号&#xff0c;只要有数据库相关操作就直接给方法加上Transactio…

python函数实例化_用Python实例化函数

python函数实例化In terms of Mathematics and Computer science, currying is the approach/technique by which we can break multiple-argument function to single argument function. 从数学和计算机科学的角度来看&#xff0c; 柯里化是一种方法/技术&#xff0c;通过它我…

京东二面:MySQL 主从延迟、读写分离 7 种解决方案!

我们都知道互联网数据有个特性&#xff0c;大部分场景都是 读多写少&#xff0c;比如&#xff1a;微博、微信、淘宝电商&#xff0c;按照 二八原则&#xff0c;读流量占比甚至能达到 90%结合这个特性&#xff0c;我们对底层的数据库架构也会做相应调整。采用 读写分离处理过程&…

array_keys_PHP array_keys()函数与示例

array_keysPHP array_keys()函数 (PHP array_keys() function) array_keys() function is used to get the keys of an array, it accepts an array as an argument and returns a new array containing keys. array_keys()函数用于获取数组的键&#xff0c;它接受一个数组作为…

再见Postman,这款API神器更好用!

代码未动&#xff0c;文档先行其实大家都知道 API 文档先行的重要性&#xff0c;但是在实践过程中往往会遇到很多困难。程序员最讨厌的两件事&#xff1a;1. 写文档&#xff0c;2. 别人不写文档。大多数开发人员不愿意写 API 文档的原因是写文档短期收益远低于付出的成本&#…

strtolower_PHP strtolower()函数与示例

strtolowerPHP strtolower()函数 (PHP strtolower() function) strtolower() function is a string function, it accepts the string and returns an lowercase string. strtolower()函数是一个字符串函数&#xff0c;它接受该字符串并返回小写字符串。 Syntax: 句法&#xf…

如何保证数据库和缓存双写一致性?

前言数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。我很负责的告诉大家&#xff0c;该问题无论在面试&#xff0c;还是工作中遇到的概率非…

面试官:AtomicInteger是如何保证线程安全?

blog.csdn.net/nanhuaibeian/article/details/120936139一、为什么引入 AtomicInteger &#xff1f;谈到线程安全&#xff0c;会首先想到了synchronized 和 Lock,但是这种方式又有一个名字&#xff0c;叫做互斥锁&#xff0c;一次只能有一个持有锁的线程进入&#xff0c;再加上…

机器学习 训练验证测试_测试前验证| 机器学习

机器学习 训练验证测试In my previous article, we have discussed about the need to train and test our model and we wrote a code to split the given data into training and test sets. 在上一篇文章中&#xff0c;我们讨论了训练和测试模型的必要性&#xff0c;并编写了…

如何判断线程池已经执行完所有任务了?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;很多场景下&#xff0c;我们需要等待线程池的所有任务都执行完&#xff0c;然后再进行下一步操作。对于线程 Thread …

IRCTC的完整形式是什么?

IRCTC&#xff1a;印度铁路餐饮和旅游公司 (IRCTC: Indian Railways Catering and Tourism Corporation) IRCTC is an abbreviation of Indian Railways Catering and Tourism Corporation. It is a subsidiary of the Indian Railway established by the Ministry of Railways…

分布式锁的 3 种实现方案!

前言 大家好&#xff0c;我是磊哥。今天跟大家探讨一下分布式锁的设计与实现。希望对大家有帮助&#xff0c;如果有不正确的地方&#xff0c;欢迎指出&#xff0c;一起学习&#xff0c;一起进步哈~分布式锁概述数据库分布式锁Redis分布式锁Zookeeper分布式锁三种分布式锁对比1.…

java学习笔记16--异常

java学习笔记16--异常 异常 异常时导致程序中断运行的一种指令流&#xff0c;如果不对异常进行正确的处理&#xff0c;则可能导致程序的中断执行&#xff0c;造成不必要的损失&#xff0c; 所以在程序的设计中必须要考虑各种异常的发生&#xff0c;并正确的做好相应的处理&am…

ruby hash添加数据_如何在Ruby中向Hash添加元素?

ruby hash添加数据Before going through the ways to add elements to the hash instances, let us understand what could be called as a hash element. So, Hash is the collection of keys and their values. For example, 在介绍向哈希实例添加元素的方法之前&#xff0c;…

线程安全问题的 3 种解决方案!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;线程安全是指某个方法或某段代码&#xff0c;在多线程中能够正确的执行&#xff0c;不会出现数据不一致或数据污染的…

黑色30s高并发IIS设置

在这篇博文中&#xff0c;我们抛开对阿里云的怀疑&#xff0c;完全从ASP.NET的角度进行分析&#xff0c;看能不能找到针对问题现象的更合理的解释。 “黑色30秒”问题现象的主要特征是&#xff1a;排队的请求&#xff08;Requests Queued&#xff09;突增&#xff0c;到达HTTP.…

我们可以覆盖Java中的main()方法吗?

The question is that "Can we override main() method in Java?" 问题是“我们可以覆盖Java中的main()方法吗&#xff1f;” No, we cant override the main() method in java. 不&#xff0c;我们不能覆盖java中的main()方法 。 First, we will understand what …

一文读懂MySQL查询语句的执行过程

需要从数据库检索某些符合要求的数据&#xff0c;我们很容易写出 Select A B C FROM T WHERE ID XX 这样的SQL&#xff0c;那么当我们向数据库发送这样一个请求时&#xff0c;数据库到底做了什么&#xff1f;我们今天以MYSQL为例&#xff0c;揭示一下MySQL数据库的查询过程&a…

angularJS的$http.post请求,.net后台接收不到参数值的解决方案

JS通用部分var shoppingCartModule angular.module(starter, [ionic], function ($httpProvider) {// Use x-www-form-urlencoded Content-Type$httpProvider.defaults.headers.post[Content-Type] application/x-www-form-urlencoded;charsetutf-8;/*** The workhorse; conve…

带有示例的Python列表reverse()方法

列出reverse()方法 (List reverse() Method) reverse() method is used to reverse the elements of the list, the method is called with this list (list in which we have to reverse the elements) and it reverses all elements in the list. reverse()方法用于反转列表中…