这篇文章主要介绍了java10新特性的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下

Java10是Java版本23年历史上速度最快的版本。Java一直被批评成长和进化缓慢,但Java10打破了这种观念。Java10是一个未来会有很多变化的版本。它的范围和影响可能不明显,但很牵强。

在本文中,我们将讨论Java10版本中添加的各种特性。在此之前,让我们回顾一下java发布模型中引入的一些变化。


长期支持模式

从2017年开始,OracleampJava社区宣布六个月换一个Java的新节奏。它转向了oracle javase产品的长期支持(LTS)模式。

LTS产品将从甲骨文中提供卓越和持续的支持,并将每3年被锁定一次。

每个Java发行版都由一个或两个驱动发行版的主要特性建模。任何障碍都会推迟发布和上市。Jigsaw项目是Java9的一大特色,它将发布日期推迟了好几次,发布时间也推迟了1.5年以上。6个月的cadence版本将遵循发布顺序。每半年有一次列车放行时间表。使切口适合汽车的特征;否则,他们就等待下一趟预定的火车。


Oracle JDK与Open JDK之比较

为了对开发者更友好,OracleampJava社区现在将OpenJDK作为主要的JDK来推广。这和前期相比是一个很大的解脱,当时JDK是合适的,由甲骨文授权,对再发行有各种限制。然而,甲骨文将继续生产JDK,但只是长期支持的版本。这是朝着更加云友好和容器友好的方向发展,因为开放的JDK库可以作为容器的一部分进行分发。

Openjdk将每6个月发布一次,而Oracle JDK将每3年发布一次(LTS版)。


将采用哪些JDK?

大型组织需要时间在不同版本之间移动;他们会坚持这个版本,直到他们能做到。业界对Java6的采用超过了Java7,随后业界逐渐转向Java8。在我看来,LTS版将最受企业青睐。然而,还不清楚它是oraclejdk的LTS版本还是openjdk,部分原因是云计算领域正在做大量的工作。

Java9和Java10是非LTS版本。计划于2018年9月发布的Java11将是LTS版本。


Java10功能

让我们来看看Java10中可用的特性。


基于时间的版本控制(JEP 322)

随着基于时间的发布周期的采用,对于当前和未来的基于时间的发布模式,Oracle已经改变了javase平台和JDK的版本字符串方案,以及相关的版本控制信息。

新模式的版本号是:

$FEATURE.$INTERIM.$UPDATE.$PATCH

$FEATURE:计数器每6个月递增一次,版本根据功能发布,例如:JDK 10,JDK 11。

$ inter:计数器对于包含兼容的错误修复和增强但没有不兼容的更改的非功能性版本,计数器将增加。通常,这将是零,因为不会有六个月的临时发布。这是为将来发布模型的修订保留的。

$ update:将增加用于修复新功能中的安全问题、降级和bug的Counter的兼容更新版本。此功能将在发布后一个月更新,此后每三个月更新一次。2018年4月版本是JDK10.0.1,7月版本是JDK10.0.2,以此类推。

$PATCH:计数器将在紧急版本中添加,以修复关键问题。

添加了一个新的API来以编程方式获取这些计数器值。我们来看看;

Version version = Runtime.version();version.feature();version.interim();version.update();version.patch();

现在,让我们看看返回版本信息的Java启动器:

$ java -versionjava version "10" 2018-03-20Java(TM) SE Runtime Environment 18.3 (build 10+46)Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

版本格式是“10”,因为除了0没有其他计数器。添加发布日期。18.3可以理解为2018年第3个月,10+46版本是10版本的第46个版本。对于假设的JDK10.0.1的build 93,build将是10.0.1+93。


局部变量类型推断(JEP 286)

局部变量类型推断是Java10中为开发者提供的最大的新特性。用初始值设定项将其类型推理添加到局部变量声明中。局部类型推理只能在下列情况下使用:

仅限于具有初始值设定项的局部变量 增强for循环的索引 在for循环中声明的本地

让我们来看看它的用法:

var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayListlt;Stringgt;// Index of Enhanced For Loopfor (var number : numbers) {System.out.println(number);}// Local variable declared in a loopfor (var i = 0; i lt; numbers.size(); i++) {System.out.println(numbers.get(i));}


实验性基于Java的JIT编译器(JEP 317)

这个特性使得Graal,一个基于Java的JIT编译器,可以在Linux/x64平台上作为一个实验性的JIT编译器使用。到目前为止,这是Java10特性列表中最具未来感的内容。

Graal是java9中引入的。它是我们习惯的JIT编译器的替代品。它是JVM的一个插件,也就是说JIT编译器不绑定JVM,它可以动态插入任何其他兼容JVMCI (Java级JVM编译器接口)的插件。它还带来了java世界中的高级编译(AOT)。它还支持多语言翻译。

"一个基于Java的实时编译器,用Java编写,用于将Java字节码转换成机器码."这是不是很混乱?如果JVM是用Java写的,难道不需要JVM来运行吗?JVM可以通过AOT编译,然后在jvmit中使用JIT编译器,通过实时代码优化来提高性能。

Graal是用Java从头开始完全重写JIT编译器。以前的JIT编译器是用c++写的。它被认为是任何编程语言发展的最后阶段。

您可以使用以下jvm参数切换到Graal:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler


应用程序级数据共享(JEP 310)

此功能有助于改善空的启动时间,并扩展现有的类数据共享(“CDS”)功能,以允许将应用程序类放置在共享档案中。

当JVM启动时,它执行一些预备步骤,其中之一是在内存中加载类。如果有几个包含多个类的jar,那么第一个请求的延迟是很明显的。这就变成了无服务器架构的问题,在这种架构中,引导时间至关重要。为了缩短应用程序启动时间,可以使用应用程序类数据共享。其思想是通过在不同的Java进程之间共享公共的类元数据来减少对空的占用。这可以通过以下三个步骤实现:

确定要归档的类:使用java launcher创建要归档的文件列表,可以通过以下参数实现:

$java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld

Create AppcdS Archive:使用java launcher创建用于应用程序CD的文件列表的档案,这可以通过以下参数实现:

$java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar

使用AppcdS归档:使用带有以下参数的Java启动器来使用应用程序CD。

$java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld


G1并行Full GC(JEP 307)

G1垃圾收集器是jdk9中的默认设置。G1垃圾收集器避免了任何完整的垃圾收集,但是当用于收集的并发线程不能足够快地恢复内存时,用户体验将受到影响。

这一改变通过使完全GC并行来改善G1的最坏情况延迟。作为此更改的一部分,G1收集器的标记-清除压缩算法被并行化,当用于收集的并发线程无法足够快地恢复内存时,将会触发该算法。


垃圾收集器接口(JEP 304)

这个JEP是未来的变化。它通过引入一个公共的垃圾收集器接口,改进了不同垃圾收集器的代码隔离。

这一变化为内部GC代码提供了更好的模块化。这将有助于在未来添加新的GC,而不改变现有的代码库,也有助于删除或管理以前的GC。


附加Unicode语言标记扩展(JEP 314)

该函数增强了java.util.Locale语言环境和相关的API,以实现BCP 47语言标记的额外Unicode扩展。从JavaSE9开始,BCP47U语言标记支持的扩展是“ca”和“nu”。此JEP将添加对以下附加扩展的支持:

cu(货币类型) fw(每周第一天) rg(区域覆盖) tz(时区)

为了支持这些额外的扩展,各种API已经进行了更改,以提供基于U或额外扩展的信息。

java.text.DateFormat::get*Instancejava.text.DateFormatSymbols::getInstancejava.text.DecimalFormatSymbols::getInstancejava.text.NumberFormat::get*Instancejava.time.format.DateTimeFormatter::localizedByjava.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePatternjava.time.format.DecimalStyle::ofjava.time.temporal.WeekFields::ofjava.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}java.util.Currency::getInstancejava.util.Locale::getDisplayNamejava.util.spi.LocaleNameProvider


根证书(JEP 319)

为了推广OpenJDK并使其对社区用户更具吸引力,该特性在JDK提供了一组默认的根证书颁发机构(CA)证书。这也意味着Oracle和openjdk二进制文件在功能上是相同的。

的关键安全组件(如TLS)默认情况下将在OpenJDK版本中工作。


Thread-Local 线程本地握手(JEP 312)

这是JVM的一个内部特性,用于提高性能。

握手操作是对每个处于safepoint状态的JavaThread的回调。回调或者由线程本身执行,或者由VM线程执行,同时保持线程阻塞。

这个特性提供了一种在线程上执行回调而不执行全局VM安全点的方法。停止单个线程,而不是停止所有线程或者根本不停止任何线程是可能的,而且代价很低。


替代内存设备上的堆分配(JEP 316)

应用程序变得缺乏内存,云原生应用程序、内存数据库和流应用程序正在增加。为了满足这些服务,有各种存储器架构可用。这个特性增强了HotSpot VM在用户指定的备用内存设备(如NV-DIMM)上分配Java对象堆的能力。

这种JEP针对的是与DRAM具有相同语义(包括原子操作的语义)的替代存储设备。因此,可以在不改变现有应用程序代码的情况下,为对象堆替换DRAM。


删除Native-Header生成工具Javah(Jep313)

这是从JDK中移除javah工具的一个内部变更。javac中添加的工具函数是jdk8的一部分,它提供了在编译时编写原生头文件的能力,从而使javah变得无用。


将JDK林整合到单个存储库中(JEP 296)

多年来,JDK代码库中有各种各样的Mercurial库。不同的存储库确实提供了一些优点,但是它们也有不同的操作缺点。作为这种变化的一部分,JDK的许多存储库已经被合并成一个存储库,以简化开发。


API更改

Java10增加和删除了API(没错,不是拼写错误)。

Java9引入了增强的弃用,其中一些API被标记为在未来版本中删除。

新增API:Java 10中新增了73个API。

让我们来看看一些补充内容:

List、Map和Set接口是通过静态copyOf(Collection)方法添加的。它返回包含所提供条目的不可修改的列表、映射或集合。对于列表,如果给定的列表随后被修改,返回的列表将不会反映这些修改。

Optionalamp它的原始变量获得一个方法orelsetrow()。这与get()完全相同,但是javadoc声明它是get()的首选替代方案

Collectors类获得了收集不可修改集合(集合、列表、映射)的各种方法。

Listlt;Stringgt; actors = new ArrayListlt;gt;();actors.add("Jack Nicholson");actors.add("Marlon Brando");System.out.println(actors); // prints [Jack Nicholson, Marlon Brando]// New API added - Creates an UnModifiable List from a List.Listlt;Stringgt; copyOfActors = List.copyOf(actors);System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]// copyOfActors.add("Robert De Niro"); Will generate an// UnsupportedOperationExceptionactors.add("Robert De Niro");System.out.println(actors);// prints [Jack Nicholson, Marlon Brando, Robert De Niro]System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]String str = "";Optionallt;Stringgt; name = Optional.ofNullable(str);// New API added - is preferred option then get() methodname.orElseThrow(); // same as name.get() // New API added - Collectors.toUnmodifiableListListlt;Stringgt; collect = actors.stream().collect(Collectors.toUnmodifiableList());// collect.add("Tom Hanks"); // Will generate an// UnsupportedOperationException

以上是Java10新特性总结的详细内容。更多关于Java10新特性的信息,请关注源搜网其他相关文章!