热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java10新特性解读

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

Java10是Java版本23年历史上最快的版本。Java因其缓慢的增长和进化而受到批评,但Java10打破了这一概念。Java10是一个具有许多未来变化的版本,其范围和影响可能并不明显,但却很牵强。

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

长期支持模式

从2017年开始,Oracle&Java社区宣布将向为期6个月的Java新节奏转变。它转向了oracle javase产品的长期支持(LTS)模型。

LTS版本的产品将提供甲骨文卓越和持续的支持,并将每3年瞄准一次。

每个Java发行版都是以一个或两个主要特性为模型的,这些特性驱动发行版。任何障碍都会推迟发布和推迟上市。Jigsaw项目是Java9的一个主要特性,它将发布日期推迟了几次,发布时间推迟了1.5年以上。6个月的cadence发布将遵循发布序列。放行列车每6个月有一个时间表。使切口上车的特征;否则它们等待下一列预定的火车。

Oracle JDK与Open JDK之比较

为了对开发人员更加友好,Oracle&Java社区现在将OpenJDK作为主要JDK来推广。这与早些时候相比是一个很大的解脱,当时JDK是适当的,并由Oracle授权,Oracle对重新分发有各种限制。不过,Oracle将继续生产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:counter将每6个月递增一次,并且将基于功能发布版本,例如:JDK 10、JDK 11。

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

$UPDATE:counter对于修复新特性中的安全问题、退化和bug的兼容更新版本将增加。此功能发布后一个月更新,以后每3个月更新一次。2018年4月的版本是JDK10.0.1,7月的版本是JDK10.0.2,以此类推

$PATCH:counter将在紧急版本中增加,以修复关键问题。

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

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

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

$ java -version
java version "10" 2018-03-20
Java(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的假设构建93,构建将是10.0.1+93

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

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

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

我们来看看它的用法:

var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList
// Index of Enhanced For Loop
for (var number : numbers) {
	System.out.println(number);
}
// Local variable declared in a loop
for (var i = 0; i 

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

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

Graal是在java9中引入的。它是我们已经习惯的JIT编译器的替代品。它是JVM的一个插件,这意味着JIT编译器没有绑定到JVM,它可以动态地插入JVMCI兼容的任何其他插件(Java级JVM编译器接口)。它还带来了java世界中的提前编译(AOT)。它还支持多语言翻译。

“一个用Java编写的基于Java的实时编译器,用于将Java字节码转换为机器码。”这让人困惑吗?如果JVM是用Java编写的,那么您不需要JVM来运行JVM吗?JVM可以通过AOT编译,然后JIT编译器可以在jvmit中使用,通过实时代码优化来提高性能。

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

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

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

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

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

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

确定要存档的类:使用java启动器创建要存档的文件列表,这可以通过以下参数实现:

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

创建AppCDS存档:使用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收集器的mark-sweep compact算法作为此更改的一部分被并行化,当用于收集的并发线程不能足够快地恢复内存时,它将被触发。

垃圾收集器接口(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*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)

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

关键的安全组件(如TLS)将在OpenJDK构建中默认工作。

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

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

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

此功能提供了一种在线程上执行回调而不执行全局VM safepoint的方法。使停止单个线程,而不仅仅是停止所有线程或不停止任何线程既可能又便宜。

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

应用程序已经变得内存匮乏,云本地应用程序、内存数据库、流式应用程序都在增加。为了满足这些服务,有各种可用的内存体系结构。此功能增强了HotSpot VM在用户指定的备用内存设备(如NV-DIMM)上分配Java对象堆的能力。

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

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

这是一个从JDK中删除javah工具的内务管理更改。javac中添加的工具功能是jdk8的一部分,它提供了在编译时编写Native-Header文件的能力,从而使javah变得无用。

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

多年来,在JDK代码库中有各种Mercurial存储库。不同的存储库确实提供了一些优势,但它们也有不同的操作缺点。作为此更改的一部分,JDK的许多存储库被合并到一个存储库中,以简化开发。

API更改

Java10已经添加和删除了API(是的,它不是一个拼写错误)。

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

添加了API:Java10中添加了73个新API。

让我们看一些补充:

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

Optional&它的原语变体获取一个方法orelsetrow()。这与get()完全相同,但是javadoc声明它是get()的首选替代方法

Collectors类获取用于收集不可修改集合(SetListMap)的各种方法

List actors = new ArrayList<>();
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.
List copyOfActors = List.copyOf(actors);
System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
// copyOfActors.add("Robert De Niro"); Will generate an
// UnsupportedOperationException
actors.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 = "";
Optional name = Optional.ofNullable(str);
// New API added - is preferred option then get() method
name.orElseThrow(); // same as name.get() 

// New API added - Collectors.toUnmodifiableList
List collect = actors.stream().collect(Collectors.toUnmodifiableList());
// collect.add("Tom Hanks"); // Will generate an
// UnsupportedOperationException

以上就是Java10新特性总结的详细内容,更多关于Java10新特性的资料请关注其它相关文章!


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
author-avatar
混事珊远_692
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有