Contents

Java 10中的新功能

1. 简介

JDK 10 是 Java SE 10 的实现,于 2018 年 3 月 20 日发布。 在本文中,我们将介绍和探索 JDK 10 中引入的新特性和更改。

2. 局部变量类型推断

请点击链接以获取有关此功能的深入文章: Java 10 局部变量类型推断

3. 不可修改的集合

Java 10 中有一些与不可修改集合相关的更改。

3.1. copyOf()

java.util.Listjava.util.Mapjava.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收集到不可修改的ListMapSet中:

@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.Optionaljava.util.OptionalDoublejava.util.OptionalIntjava.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 版本。这具有以下含义:

  1. **每六个月发布一个新的 Java 版本。**2018 年 3 月的版本是 JDK 10,2018 年 9 月的版本是 JDK 11,依此类推。这些被称为功能发布,预计至少包含一两个重要功能
  2. 对功能发布的支持将仅持续六个月,即直到下一个功能发布
  3. 长期支持版本将被标记为 LTS。对此类版本的支持将持续三年
  4. 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)