Java 18 正式发布,默认 UTF-8,finalize 被弃用,别再乱用了! 以你之姓@ 2023-09-30 11:06 1阅读 0赞 ### JDK 18 正式发布 ### JDK 17 刚发布半年,JDK 18 又如期而至,JDK 版本号这算是成年了? JDK 18 发布了,栈长继续为大家解读! ![e1d7a6e4e99230f6eac00ad8950814e2.png][] ![16b03ea1216151713cb596e940005afd.png][] JDK 18 延续了 JDK 17 开创的免费策略,但,JDK 18~20 不是长期支持版本,注意不要用在生产。 **最新 Oracle Java 支持路线图:** ![b2f9f69b575c036a813ad2ab81201447.png][] ### JDK 18 新特性一览 ### <table> <thead> <tr> <th>ID</th> <th>特性</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>400:UTF-8 by Default</td> <td>默认 UTF-8</td> </tr> <tr> <td>2</td> <td>408:Simple Web Server</td> <td>简单 Web 服务器</td> </tr> <tr> <td>3</td> <td>413:Code Snippets in Java API Documentation</td> <td>简化文档代码片段</td> </tr> <tr> <td>4</td> <td>416:Reimplement Core Reflection with Method Handles</td> <td>重新实现反射核心机制</td> </tr> <tr> <td>5</td> <td>417:Vector API (Third Incubator)</td> <td>矢量 API(三次孵化中)</td> </tr> <tr> <td>6</td> <td>418:Internet-Address Resolution SPI</td> <td>互联网地址解析 SPI</td> </tr> <tr> <td>7</td> <td>419:Foreign Function & Memory API (Second Incubator)</td> <td>外部函数和内存 API(二次孵化中)</td> </tr> <tr> <td>8</td> <td>420:Pattern Matching for switch (Second Preview)</td> <td>switch 模式匹配(二次预览中)</td> </tr> <tr> <td>9</td> <td>421:Deprecate Finalization for Removal</td> <td>弃用 Finalization</td> </tr> </tbody> </table> 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.encoding file.encoding = UTF-8 file.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][] [e1d7a6e4e99230f6eac00ad8950814e2.png]: https://img-blog.csdnimg.cn/img_convert/e1d7a6e4e99230f6eac00ad8950814e2.png [16b03ea1216151713cb596e940005afd.png]: https://img-blog.csdnimg.cn/img_convert/16b03ea1216151713cb596e940005afd.png [b2f9f69b575c036a813ad2ab81201447.png]: https://img-blog.csdnimg.cn/img_convert/b2f9f69b575c036a813ad2ab81201447.png [1679d3950e81813f3ae4a90c11bfdc4d.png]: https://img-blog.csdnimg.cn/img_convert/1679d3950e81813f3ae4a90c11bfdc4d.png [d4cea9815ec8b0c3f060be8f1768182f.gif]: https://img-blog.csdnimg.cn/img_convert/d4cea9815ec8b0c3f060be8f1768182f.gif [664456d45e7ad656e3b284b75275b1b3.png]: https://img-blog.csdnimg.cn/img_convert/664456d45e7ad656e3b284b75275b1b3.png [45e18129d2f03ad34570b965d1bf0915.png]: https://img-blog.csdnimg.cn/img_convert/45e18129d2f03ad34570b965d1bf0915.png [73e42e908b417774b29d2a43b6363e0b.png]: https://img-blog.csdnimg.cn/img_convert/73e42e908b417774b29d2a43b6363e0b.png [68e065e45490d99f5c917b81c5875c73.gif]: https://img-blog.csdnimg.cn/img_convert/68e065e45490d99f5c917b81c5875c73.gif
还没有评论,来说两句吧...