Java 10中的新特性
最后修改:2021年1月18日
1.介绍
JDK 10它是Java SE 10的一个实现,于2018年3月20日发布。
在本文中,我们将介绍和探索JDK 10中引入的新特性和更改。
2.局部变量型推理
以下链接将为您提供一篇关于该功能的深入文章:
3.无法改变的集合
在Java 10中有一些与不可修改集合相关的更改。
3.1。copyOf ()
并不知道,java.util.Map和java.util.Set每个都有一个新的静态方法copyOf(集合)。
它返回给定的不可修改的副本集合:
@Test(expected = UnsupportedOperationException.class) public void whenModifyCopyOfList_thenThrowsException() {List copyList = List. copyof (someIntList);copyList.add (4);}
任何修改此类集合的尝试都会导致java.lang.UnsupportedOperationException运行时异常。
3.2。toUnmodifiable * ()
java.util.stream.Collectors获取收集a的附加方法流为无法改变的列表,地图或集:
@Test(expected = UnsupportedOperationException.class) public void whenmodifytoounmodifiablelist_thenthrowsexception () {List evenList = someIntList.stream() .filter(i -> i % 2 == 0) .collect(collections . toounmodifiablelist ());evenList.add (4);}
任何修改此类集合的尝试都会导致java.lang.UnsupportedOperationException运行时异常。
4.可选* .orElseThrow ()
java.util.Optional,java.util.OptionalDouble,java.util.OptionalInt和java.util.OptionalLong每个人都有一个新方法orElseThrow ()哪个不带任何参数并抛出NoSuchElementException如果没有值:
@Test public void whenlistcontainsinteger_orelsethrowturnnsinteger () {Integer firstEven = someIntList.stream() .filter(i -> i % 2 == 0) .findFirst() .orElseThrow();(firstEven) .equals (Integer.valueOf (2));}
它是同义词,现在是现有的首选替代方案get ()方法。
5.性能改进
以下链接将为您提供一篇关于该功能的深入文章:
6.容器的意识
jvm现在知道是在Docker容器中运行的并提取特定于容器的配置,而不是查询操作系统本身——它适用于分配给容器的cpu数量和总内存等数据。
然而,这种支持仅适用于基于linux的平台。这种新支持在默认情况下是启用的,可以在命令行中使用JVM选项禁用:
- xx: -UseContainerSupport
此外,这个更改增加了一个JVM选项,可以指定JVM将使用的cpu数量:
- xx: ActiveProcessorCount =计数
此外,增加了三个新的JVM选项,允许Docker容器用户获得更细粒度的控制系统内存量,将用于Java堆:
- xx: InitialRAMPercentage - xx: MaxRAMPercentage - xx: MinRAMPercentage
7.根证书
到目前为止,cacerts keystore最初是空的,目的是包含一组根证书,这些证书可用于在各种安全协议使用的证书链中建立信任。
因此,像TLS这样的关键安全组件在OpenJDK构建下默认情况下无法工作。
在Java 10中,Oracle开放了根证书的源代码为了使OpenJDK的构建对开发人员更具吸引力,并减少这些构建与Oracle JDK构建之间的差异。
8.不支持和删除
8.1。命令行选项和工具
工具javah已经从Java 10中删除,Java 10生成了实现本地方法所需的C头文件和源文件——现在,javac - h可以用来代替。
policytool是用于策略文件创建和管理的基于UI的工具。现在已经删除了。用户可以使用简单的文本编辑器来执行此操作。
删除java -Xprof选择。该选项用于对正在运行的程序进行概要分析,并将概要分析数据发送到标准输出。用户现在应该使用jmap工具来代替。
8.2。api
已弃用的Java .security.acl包已经被标记为forremove =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,等等。这些被称为特性发布,预计至少包含一到两个重要特性
- 对新特性的支持只会持续6个月也就是说,直到下一个特性发布
- 长期支持发布将被标记为lt。对这种释放的支持将持续三年
- Java 11将会是一个LTS版本
java - version现在将包含GA日期吗,更容易确定发布的时间:
$ java -version openjdk version "10" 2018-03-20 openjdk运行时环境18.3 (build 10+46)
10.结论
在本文中,我们看到了Java 10带来的新特性和变化。
像往常一样,可以找到代码片段在GitHub。