Java 10中的新功能
1. 简介
JDK 10 是 Java SE 10 的实现,于 2018 年 3 月 20 日发布。 在本文中,我们将介绍和探索 JDK 10 中引入的新特性和更改。
2. 局部变量类型推断
请点击链接以获取有关此功能的深入文章: Java 10 局部变量类型推断
3. 不可修改的集合
Java 10 中有一些与不可修改集合相关的更改。
3.1. copyOf()
java.util.List、java.util.Map和java.util.Set每个都有一个新的静态方法copyOf(Collection)。 它返回给定集合的不可修改的副本:
@Test(expected = UnsupportedOperationException.class)
public void whenModifyCopyOfList_thenThrowsException() {
List<Integer> copyList = List.copyOf(someIntList);
copyList.add(4);
}
任何修改此类集合的尝试都将导致java.lang.UnsupportedOperationException运行时异常。
3.2. toUnmodifiable()
java.util.stream.Collectors获得额外的方法来将Stream收集到不可修改的List、Map或Set中:
@Test(expected = UnsupportedOperationException.class)
public void whenModifyToUnmodifiableList_thenThrowsException() {
List<Integer> evenList = someIntList.stream()
.filter(i -> i % 2 == 0)
.collect(Collectors.toUnmodifiableList());
evenList.add(4);
}
任何修改此类集合的尝试都将导致java.lang.UnsupportedOperationException运行时异常。
4. Optional.orElseThrow()
java.util.Optional、java.util.OptionalDouble、java.util.OptionalInt和java.util.OptionalLong都有一个新方法orElseThrow(),它不接受任何参数,如果不存在值则抛出NoSuchElementException :
@Test
public void whenListContainsInteger_OrElseThrowReturnsInteger() {
Integer firstEven = someIntList.stream()
.filter(i -> i % 2 == 0)
.findFirst()
.orElseThrow();
is(firstEven).equals(Integer.valueOf(2));
}
*它是现有*get()方法的同义词,现在是首选替代方法。
5. 性能改进
请点击链接以获取有关此功能的深入文章: Java 10 性能改进
6. 容器意识
**JVM 现在知道在 Docker 容器中运行,**并将提取特定于容器的配置,而不是查询操作系统本身——它适用于诸如 CPU 数量和已分配给容器的总内存之类的数据。
但是,此支持仅适用于基于 Linux 的平台。默认情况下启用此新支持,并且可以在命令行中使用 JVM 选项禁用:
-XX:-UseContainerSupport
此外,此更改添加了一个 JVM 选项,该选项提供了指定 JVM 将使用的 CPU 数量的能力:
-XX:ActiveProcessorCount=count
此外,还添加了三个新的 JVM 选项,以允许 Docker 容器用户对将用于 Java 堆的系统内存量进行更细粒度的控制:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
7. 根证书
cacerts 密钥库到目前为止最初是空的,旨在包含一组根证书,可用于在各种安全协议使用的证书链中建立信任。 因此,在 OpenJDK 构建下,TLS 等关键安全组件默认不起作用。 在 Java 10 中,Oracle 开源了Oracle Java SE Root CA 程序中的根证书,以使 OpenJDK 构建对开发人员更具吸引力,并减少这些构建与 Oracle JDK 构建之间的差异。
8. 弃用和删除
8.1. 命令行选项和工具
工具javah已从 Java 10 中删除,该工具生成了实现本机方法所需的 C 头文件和源文件——现在,可以使用*javac -h *代替。 policytool是基于 UI 的策略文件创建和管理工具。现在已将其删除。用户可以使用简单的文本编辑器来执行此操作。
删除了* java -Xprof选项。该选项用于分析正在运行的程序并将分析数据发送到标准输出。用户现在应该改用jmap*工具。
8.2. API
已弃用的 java.security.acl 包已标记为 forRemoval=true,并且可能会在 Java SE 的未来版本中被删除。它已被java.security.Policy和相关类所取代。 同样,java.security.{Certificate,Identity,IdentityScope,Signer} API 被标记为forRemoval=true。
9. 基于时间的发布版本控制
从 Java 10 开始,Oracle 已转向基于时间的 Java 版本。这具有以下含义:
- **每六个月发布一个新的 Java 版本。**2018 年 3 月的版本是 JDK 10,2018 年 9 月的版本是 JDK 11,依此类推。这些被称为功能发布,预计至少包含一两个重要功能
- 对功能发布的支持将仅持续六个月,即直到下一个功能发布
- 长期支持版本将被标记为 LTS。对此类版本的支持将持续三年
- Java 11 将是 LTS 版本
java -version现在将包含 GA 日期,从而更容易识别版本的年龄:
$ java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+46)
OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)