🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Java 10 特性和增强特性 > 原文: [https://howtodoinjava.com/java10/java10-features/](https://howtodoinjava.com/java10/java10-features/) 在 [Java 9](https://howtodoinjava.com/java9/java9-new-features-enhancements/) 发布之后,Java 10 很快问世。 与以前的版本不同,Java 10 并没有那么多令人兴奋的特性,但仍然没有几个重要的更新会改变您的编码方式以及其他将来的 Java 版本。 ```java Table of Contents JEP 286: Local Variable Type Inference JEP 322: Time-Based Release Versioning JEP 304: Garbage-Collector Interface JEP 307: Parallel Full GC for G1 JEP 316: Heap Allocation on Alternative Memory Devices JEP 296: Consolidate the JDK Forest into a Single Repository JEP 310: Application Class-Data Sharing JEP 314: Additional Unicode Language-Tag Extensions JEP 319: Root Certificates JEP 317: Experimental Java-Based JIT Compiler JEP 312: Thread-Local Handshakes JEP 313: Remove the Native-Header Generation Tool New Added APIs and Options Removed APIs and Options ``` ## JEP 286:局部变量类型推断 Java 现在具有`var`样式声明。 它允许您声明局部变量而无需指定其类型。 变量的类型将从创建的实际对象的类型推断出来。 它声称是 JDK 10 中开发人员唯一真正的特性。 ```java var str = "Hello world"; //or String str = "Hello world"; ``` 在上面的示例中,两个语句都是等效的。 在第一句话中,`str`的类型由分配类型`String`的类型确定。 > 阅读更多: [Java `var` – 局部变量类型推断](https://howtodoinjava.com/java10/var-local-variable-type-inference/) ## JEP 322:基于时间的发行版本控制 从 Java 10 开始,Oracle 调整了基于时间的版本字符串方案。 版本号的新格式为: ```java $FEATURE.$INTERIM.$UPDATE.$PATCH ``` 与旧版本不同,新的基于时间的版本不会延迟,并且特性将每六个月发布一次,并且对发布中的哪些特性没有限制。 也有长期发行(LTS)。 它主要针对企业客户。 LTS 版本的产品将提供 Oracle 的首要和持续的支持,目标是每三年一次。 此外,这些版本的更新将至少提供三年。 > 阅读更多: [Java 版本 – 基于时间的发行版本控制](https://howtodoinjava.com/java10/java-version/) ## JEP 304:垃圾收集器接口 在早期的 JDK 结构中,构成垃圾收集器(GC)实现的组件分散在代码库的各个部分。 它已在 Java 10 中进行了更改。现在,它是 JVM 源代码中的一个干净接口,可以快速轻松地集成替代收集器。 它将改善不同垃圾收集器的源代码隔离。 这纯粹是重构。 之前工作的所有内容都需要事后进行工作,并且性能不应降低。 ## JEP 307:用于 G1 的并行全 GC Java 9 引入了 G1(垃圾优先)垃圾收集器。 G1 垃圾收集器的设计避免了完整的收集,但是当并发收集不能足够快地回收内存时。 进行此更改后,将发生后备完整 GC。 G1 的完整 GC 的当前实现使用单线程的 mark-sweep-compact 算法。 此更改将使 mark-sweep-compact 算法并行化,并使用相同数量的线程。 当用于收集的并发线程无法足够快地恢复内存时,将触发该事件。 线程数可以通过`-XX:ParallelGCThreads`选项控制。 ## JEP 316:备用存储设备上的堆分配 进行此更改的目的是使 HotSpot VM 能够在用户指定的备用存储设备(例如 NV-DIMM)上分配 Java 对象堆。 要在此类内存中分配堆,我们可以添加一个新选项`-XX:AllocateHeapAt=<path>`。 该选项将采用文件系统的路径,并使用内存映射来实现在存储设备上分配对象堆的预期结果。 现有的与堆相关的标志,例如`-Xmx`,`-Xms`等,以及与垃圾回收相关的标志将继续像以前一样工作。 ## JEP 296:将 JDK 森林整合到单个存储库中 作为此更改的一部分,为了简化和简化开发,将 JDK 森林的许多存储库合并到一个存储库中。 在 JDK 9 中,有八个存储库:`root`,`corba`,`hotspot`,`jaxp`,`jaxws`,`jdk`,`langtools`和`nashorn`。 在统一森林中,通常将 Java 模块的代码合并在单个顶级`src`目录下。 例如,今天在 JDK 森林中,存在基于模块的目录,例如 ```java $ROOT/jdk/src/java.base ... $ROOT/langtools/src/java.compiler ... ``` 在合并林中,此代码改为组织为: ```java $ROOT/src/java.base $ROOT/src/java.compiler ... ``` ## JEP 310:应用程序类 - 数据共享 此特性的目标是改善启动范围,扩展现有的类数据共享(“ CDS”)特性,以允许将应用程序类放置在共享档案中。 JDK 5 中引入的类数据共享允许将一组类预处理为共享的存档文件,然后可以在运行时对其进行内存映射以减少启动时间。 当多个 JVM 共享同一个存档文件时,它还可以减少动态内存占用。 当前,CDS 仅允许引导类加载器加载归档的类。 应用程序 CDS 允许内置系统类加载器,内置平台类加载器和自定义类加载器加载归档的类。 指定`-XX:+UseAppCDS`命令行选项可为系统类加载器,平台类加载器和其他用户定义的类加载器启用类数据共享。 ## JEP 314:其他 Unicode 语言标签扩展 目的是增强`java.util.Locale`和相关 API,以实现 [BCP 47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) 语言标签的其他 Unicode 扩展。 最初在 Java SE 7 中添加了对 BCP 47 语言标签的支持,并且对 Unicode 语言环境扩展的支持仅限于日历和数字。 该 JEP 将在相关的 JDK 类中实现最新的 [LDML 规范](https://www.unicode.org/reports/tr35/tr35.html#Locale_Extension_Key_and_Type_Data)中指定的更多扩展。 该 JEP 将增加对以下附加扩展的支持: * cu(货币类型) * fw(一周的第一天) * rg(区域替代) * tz(时区) 修改后的相关 API 为: ```java java.text.DateFormat::get*Instance java.text.DateFormatSymbols::getInstance java.text.DecimalFormatSymbols::getInstance java.text.NumberFormat::get*Instance java.time.format.DateTimeFormatter::localizedBy java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern java.time.format.DecimalStyle::of java.time.temporal.WeekFields::of java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek} java.util.Currency::getInstance java.util.Locale::getDisplayName java.util.spi.LocaleNameProvider ``` ## JEP 319:根证书 cacerts 密钥库是 JDK 的一部分,旨在包含一组根证书,这些根证书可用于建立对各种安全协议中使用的证书链的信任。 但是,JDK 源代码中的 cacerts 密钥库当前为空。 cacerts 密钥库将填充由 Oracle Java SE Root CA Program 的 CA 颁发的一组根证书。 许多供应商已经签署了所需的协议,并且每个供应商都将包含一份根证书列表。 那些没有签署协议的人目前不会包括在内。 下一个版本将包含处理时间较长的内容。 这也意味着两个 Oracle & Open JDK 二进制文件在特性上都相同。 以后,默认的 TLS 等关键安全组件将在 OpenJDK 构建中正常工作。 ## JEP 317:基于 Java 的实验性 JIT 编译器 此特性使基于 Java 的 JIT 编译器 **Graal** 可用作 Linux / x64 平台上的实验性 JIT 编译器。 Graal 将使用 JDK 9 中引入的 JVM 编译器接口(JVMCI)。Graal 已经存在于 JDK 中,因此将其作为实验性 JIT 启用将主要是一项测试和调试工作。 要将 Graal 用作 JIT 编译器,请在 Java 命令行上使用以下选项: ```java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler ``` Graal 是从头开始完全覆盖 Java 中的 JIT 编译器。 以前的 JIT 编译器是用 C++编写的。 ## JEP 312:线程本地握手 通过使无需执行全局 VM 安全点就可以在应用程序线程上执行回调成为可能,该 JEP 为提高 VM 性能奠定了基础。 这意味着 JVM 可以停止单个线程,而不仅仅是所有线程。 线程本地握手将首先在 x64 和 SPARC 上实现。 其他平台将恢复到正常的安全点。 新的产品选项`-XX:ThreadLocalHandshakes`(默认值`true`)使用户可以在受支持的平台上选择常规安全点。 ## JEP 313:删除本机头生成工具 它将从 JDK 中删除`javah`工具,这是一个单独的工具,可在编译 JNI 代码时生成头文件,因为可以通过`javac`来完成。 这是 Java 10 的另一项着重于内务处理的特性。 ## 新增的 API 和选项 Java 10 中添加了 73 个新 API。让我们来看看其中的几个: | API | 描述 | | --- | --- | | `Optional.orElseThrow()` | 新方法`orElseThrow`已添加到`Optional`类。 它与现有的`get`方法同义,并且现在是它的首选替代方法。 | | `List.copyOf`,`Set.copyOf`和`Map.copyOf` | 这些方法从现有实例创建新的集合实例。 | | `Collectors.toUnmodifiableList`,`Collectors.toUnmodifiableSet`,`Collectors.toUnmodifiableMap` | 这些方法允许将`Stream`的元素收集到不可修改的集合中 | | `--jdk.disableLastUsageTracking` | 要为正在运行的 VM 禁用 JRE 上次使用情况跟踪。 | | `--add-stylesheet` | 在生成的文档中提供对使用多个样式表的支持。 | | `--main-stylesheet` | 为了帮助将主要样式表与任何其他样式表区分开。 | | `@summary` | 添加以明确指定用作 API 描述摘要的文本。 默认情况下,从第一句话推断出 API 描述的摘要。 | ## 删除的 API 和选项 | API | 描述 | | --- | --- | | `LookAndFeels` | | | `Runtime.getLocalizedInputStream`,`Runtime.getLocalizedOutputStream` | 已过时的国际化机制的一部分,并且没有已知用途。 | | RMI 服务器端多路复用协议支持 | 它已在 JDK 9 中禁用,现在已被删除。 | | 常见的 DOM API | `com.sun.java.browser.plugin2.DOM`和`sun.plugin.dom.DOMObject` API 已被删除。 应用程序可以使用`netscape.javascript.JSObject`来操作 DOM。 | | `FlatProfiler` | 在 JDK 9 中已弃用,已通过删除实现代码来作废。 | | `-Xoss`,`-Xsqnopause`,`-Xoptimize`,`-Xboundthreads`和`-Xusealtsigs` | 选项已删除。 | | `policytool` | *策略工具*安全工具已从 JDK 中删除。 | | `com.sun.security.auth.**`中不推荐使用的类 | 下面的类现在已移除:`com.sun.security.auth.PolicyFile`、`com.sun.security.auth.SolarisNumericGroupPrincipal`、`com.sun.security.auth.SolarisNumericUserPrincipal`、`com.sun.security.auth.SolarisPrincipal`、`com.sun.security.auth.X500Principal`、`com.sun.security.auth.module.SolarisLoginModule`、`com.sun.security.auth.module.SolarisSystem` | 总体而言,Java 10 具有许多我们日常编程中可能不会使用的特性,但是它仍然具有许多在幕后起作用的特性,从而使其成为重要的里程碑。 学习愉快!