你好啊,我是大阳,本文主要介绍Java10新特性,并提供一些代码示例。不过Java10的新特性大多数是开发者不关心的内容。

Java 9发布后,Java 10 来得非常快。与之前的版本不同,Java 10 没有那么多令人兴奋的特性,但它仍然有一些重要的更新会改变你的编码方式,以及影响其他未来的 Java 版本。

本文主要内容:

  • var关键字:局部变量类型推断(它被称为是 JDK 10 中开发人员唯一真正关心的功能
  • 基于时间的发布版本控制
  • 垃圾收集器接口
  • G1 的并行全 GC
  • 替代存储设备上的堆分配
  • 将多JDK 林 整合到单个存储库中
  • 应用程序类-数据共享
  • 附加 Unicode 语言标签扩展
  • 根证书
  • 基于 Java 的 JIT 编译器(实验性)
  • Thread-Local握手
  • 删除 Native-Header 生成工具
  • 新增的API
  • 删除的API

1. var关键字:局部变量类型推断

Java 现在有var声明。它允许开发者在不指定其类型的情况下声明局部变量。变量的类型将从创建的实际对象的类型中推断出来。它被称为是 JDK 10 中开发人员唯一真正使用到的功能。例如

var str = "Hello world";
//等同于
String str = "Hello world";

2. 基于时间的发布版本控制

从 Java 10 开始,Oracle 采用了基于时间的版本字符串方案。版本号的新格式为:

$FEATURE.$INTERIM.$UPDATE.$PATCH

与旧版本不同,新的基于时间的版本不会延迟,并且功能将每六个月发布一次,并且对版本中可以发布的功能没有限制。

也有长期版本 (LTS)。主要面向企业客户。产品的 LTS 版本将提供 Oracle 的首要且持续的支持,并且每 3 年提供一次。此外,这些版本的更新将至少提供三年。

3. 垃圾收集器接口

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。它在 Java 10 中发生了变化。现在,它是 JVM 源代码中的一个干净的接口,允许快速轻松地集成替代收集器。它将改善不同垃圾收集器的源代码隔离。

这纯粹是重构。之前工作的一切都需要事后工作,性能不应该倒退。

4. G1 的并行全 GC

Java 9 引入了 G1(垃圾优先)垃圾收集器。G1 垃圾收集器旨在避免完全收集,但是当并发收集无法足够快地回收内存时。通过此更改,将发生回退完整 GC。

G1 的完整 GC 的当前实现使用单线程标记-扫描-紧凑算法。此更改将并行化 mark-sweep-compact 算法并使用相同数量的线程。当收集的并发线程无法足够快地恢复内存时,它将被触发。

线程数可以通过-XX:ParallelGCThreads选项来控制。

5. 替代存储设备上的堆分配

此更改的目标是使 HotSpot VM 能够在用户指定的备用内存设备(例如 NV-DIMM)上分配 Java 对象堆。

要在此类内存中分配堆,我们可以添加一个新选项-XX:AllocateHeapAt=<path>. 此选项将获取文件系统的路径并使用内存映射来实现在内存设备上分配对象堆的预期结果。现有的与堆相关的标志,如-Xmx-Xms等,以及与垃圾收集相关的标志将继续像以前一样工作。

6. 将 JDK 林整合到单个存储库中

作为此更改的一部分,JDK 林的众多存储库被合并到一个存储库中,以简化和简化开发。

在 JDK 9 中有八个存储库:rootcorbahotspotjaxpjaxwsjdklangtoolsnashorn. 在统一的林中,Java 模块的代码通常组合在一个顶级src目录下。例如,今天在 JDK 林中有基于模块的目录,如

$ROOT/jdk/src/java.base
...
$ROOT/langtools/src/java.compiler
...

在合并的森林中,此代码改为组织为-

$ROOT/src/java.base
$ROOT/src/java.compiler
...

7. 应用程序类-数据共享

此功能的目标是改善启动足迹,扩展现有的类数据共享 (“CDS”) 功能以允许将应用程序类放置在共享存档中。

JDK 5 中引入的类数据共享允许将一组类预处理为共享存档文件,然后可以在运行时进行内存映射以减少启动时间。当多个 JVM 共享同一个归档文件时,它还可以减少动态内存占用。

目前 CDS 只允许引导类加载器加载归档类。应用程序 CDS 允许内置系统类加载器、内置平台类加载器和自定义类加载器加载归档类。

指定-XX:+UseAppCDS命令行选项以启用系统类加载器、平台类加载器和其他用户定义的类加载器的类数据共享。

8. 附加 Unicode 语言标签扩展

它的目标是增强java.util.Locale和相关的 API 以实现BCP 47语言标签的额外 Unicode 扩展。最初在 Java SE 7 中添加了对 BCP 47 语言标签的支持,支持仅限于日历和数字的 Unicode 语言环境扩展。此 JEP 将在相关 JDK 类中实现更多最新LDML 规范中指定的扩展。

此 JEP 将添加对以下附加扩展的支持:

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

修改后的相关API有:

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

9. 根证书

cacerts 密钥库是 JDK 的一部分,旨在包含一组根证书,可用于在各种安全协议中使用的证书链中建立信任。然而,JDK 源代码中的 cacerts 密钥库目前是空的。

cacerts 密钥库将填充一组由 Oracle 的 Java SE 根 CA 程序的 CA 颁发的根证书。许多供应商已经签署了所需的协议,并且每个供应商都将包含一份根证书列表。未签署协议的将不包括在内。那些需要更长时间处理的将包含在下一个版本中。

这也意味着 Oracle 和 Open JDK 二进制文件在功能上是相同的。TLS 等关键安全组件将默认在未来的 OpenJDK 构建中工作。

10. 基于 Java 的 JIT 编译器(实验性)

此功能使基于 Java 的 JIT 编译器Graal可以用作 Linux/x64 平台上的实验性 JIT 编译器。Graal 将使用 JDK 9 中引入的 JVM 编译器接口 (JVMCI)。Graal 已经在 JDK 中,因此将其作为实验性 JIT 启用将主要是测试和调试工作。

要启用 Graal 作为 JIT 编译器,请在 java 命令行上使用以下选项:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

Graal 是从头开始用 Java 完全重写 JIT 编译器。以前的 JIT 编译器是用 C++ 编写的。

11. Thread-Local握手

这个 JEP 为提高 VM 性能奠定了基础,它可以在应用程序线程上执行回调,而无需执行全局 VM 安全点。这意味着 JVM 可以停止单个线程,而不仅仅是所有线程。

线程本地握手最初将在 x64 和 SPARC 上实现。其他平台将退回到正常的安全点。一个新的产品选项-XX:ThreadLocalHandshakes(默认值true)允许用户在支持的平台上选择正常的安全点。

12. 删除 Native-Header 生成工具

它将javah从 JDK 中删除该工具,这是一个在编译 JNI 代码时生成头文件的单独工具,因为这可以通过javac.

这是 Java 10 的另一个专注于内务管理的特性。

13. 新增的API

Java 10 中添加了 73 个新的 API。让我们来看看其中的几个:

API 描述
Optional.orElseThrow() orElseThrow类中添加了一个新方法Optional。它是现有方法的同义词,现在是现有方法的首选替代get方法。
List.copyOf, Set.copyOf, 和Map.copyOf 这些方法从现有实例创建新的集合实例。
Collectors.toUnmodifiableList, Collectors.toUnmodifiableSet,Collectors.toUnmodifiableMap 这些方法允许将 a 的元素Stream收集到不可修改的集合中
--jdk.disableLastUsageTracking 为正在运行的 VM 禁用 JRE 上次使用跟踪。
--add-stylesheet 支持在生成的文档中使用多个样式表。
--main-stylesheet 帮助区分主样式表和任何附加样式表。
@summary标签 添加以明确指定用作 API 描述摘要的文本。默认情况下,API 描述的摘要是从第一句话推断出来的。

14. 删除的API

API 描述
LookAndFeels
Runtime.getLocalizedInputStream,Runtime.getLocalizedOutputStream 过时的国际化机制的一部分,没有已知用途。
RMI 服务器端多路复用协议支持 它在 JDK 9 中被禁用,现在已被删除。
常见的 DOM API 和API 已被删除com.sun.java.browser.plugin2.DOMsun.plugin.dom.DOMObject应用程序可以netscape.javascript.JSObject用来操作 DOM。
平面轮廓仪 在 JDK 9 中已弃用,已通过删除实现代码而过时。
-Xoss, -Xsqnopause, -Xoptimize, -Xboundthreads, 和-Xusealtsigs 已删除选项。
policytool policytool安全工具已从 JDK 中删除。
不推荐使用的类com.sun.security.auth.** 现在删除以下课程。com.sun.security.auth.PolicyFile``com.sun.security.auth.SolarisNumericGroupPrincipal``com.sun.security.auth.SolarisNumericUserPrincipal``com.sun.security.auth.SolarisPrincipal``com.sun.security.auth.X500Principal``com.sun.security.auth.module.SolarisLoginModule``com.sun.security.auth.module.SolarisSystem

总体而言,Java 10 有许多我们可能不会在日常编程中使用的特性,但它仍然有许多在幕后工作的特性使其成为重要的里程碑。

Java10新特性及代码示例相关推荐

  1. java 10新_【Java基础】Java10 新特性

    Java10 新特性 局部变量类型推断 局部变量的显示类型声明,常常被认为是不必须的. 场景一:类实例化时.在声明一个变量时,总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器. 场 ...

  2. 【小家java】java10新特性(简述十大新特性) 小步迭代

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  3. Java14发布,16大新特性,代码更加简洁明快

    2020/3/17日JDK14正式发版,生产环境用不用再说,赶紧下载下来体验一番.不过据说该版本并不是长期版本,但即使再发布新版本也是在此基础上的. 另外,想体验Java14还是需要一些准备工作的,除 ...

  4. Java10 新特性

    作为当今使用最广泛的编程语言之一的 Java 在 2018 年 3 月 21 日发布了第十个大版本.为了更快地迭代.更好地跟进社区反馈,Java 语言版本发布周期调整为每隔 6 个月发布一次.Java ...

  5. C++11中的一些新特性以及代码详解

    C++11新特性 auto decltype 追踪返回类型 类内成员初始化 列表初始化 基于范围的for循环 静态断言 noexcept修饰符 强类型枚举 常量表达式 原生字符串字面值 继承控制 fi ...

  6. Java - JDK8新特性,代码demo示例;

    哈哈哈哈大魔都下雪啦,敲段代码暖和暖和,嘿嘿 public class jdk8Test {@Testpublic void LambdaNew() {//before jdk8List<Str ...

  7. 【STM32】详解嵌入式中FLASH闪存的特性和代码示例

    一.存储器 我们正常编译生成的二进制文件,需要下载烧录到单片机里面去,这个文件保存在单片机的ROM(read only memory)中,所有可以完成这种特性的存储介质都可以称为ROM. 分类 ROM ...

  8. 【JDK8语法新特性】:超全总结{lamda,stream,optional,新日期类API},JDK8对策略模式支持,可以直接贴代码运行测试。

    文章目录 Java8新特性 速度快 代码更少(增加了新的语法,lamda表达式)(主要) 强大的Stream API(主要) 便于并行 最大减少空指针异常(Optional API) 提供了线程安全的 ...

  9. php8网站,PHP8新特性解读(开发代码实例演示)

    " 本文主要内容为解读PHP8.0的主要新特性"PHP8新特性 前言 PHP8在2020年11月26日正式发布,又一个里程碑到来. 根据官网的信息目前已经发布到了8.0.2版本,但 ...

最新文章

  1. 写好 Python 代码的几条原则
  2. 搭建linux下eclipse php完美搭建开发php,搭建linux上的Eclipse+PHP编程环境
  3. java 混合排序_字母、数字混合方式,按照自然语言排序,java版
  4. 用MySQL创建数据库和数据库表
  5. setid android,android-如何将setId()用于imageView
  6. ubuntu动态截图(GIF动画)
  7. Python库大全,建议收藏留用!
  8. 基于dijsktra算法的最短路径求解_基于dijkstra算法的AGV路径规划(含C++代码)
  9. 交叉熵的本质是极大似然估计
  10. Linux中的sed命令,使用方法之一「替换字符串中的内容 」,以及「s/ / / 」和「s/ / /g」之间的区别
  11. GCN的形象讲解1,2
  12. 数论 欧几里德算法
  13. 【转载】google搜索从入门到精通
  14. matlab调和均值滤波_MatLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数...
  15. 【数据分析】销售案例——会员分析
  16. Edge浏览器查看请求头(2022)
  17. 马克思主义哲学(一):物质
  18. SQL VIEW(视图)介绍
  19. SitePoint播客#87:MeltSheep和FireRock
  20. 可视化 | Python电影Top250数据可视化

热门文章

  1. 对搜狐视频弹幕地域黑问题的一次社工经历
  2. SQL Server 数据库基础笔记分享(上)
  3. 092:vue+openlayers 自定义组件(放大、缩小、长度测量、面积测量)
  4. docker(17):5 个好用的 Docker 图形化管理工具
  5. 3310复刻版 java_情怀满满的经典之作 诺基亚3310复刻版评测体验
  6. Android之MediaPlayer加载视频慢
  7. R语言rvest包3步爬取中国天气网国内所有城市(县)7天实时天气预报数据
  8. WPS表格如何隔列求和
  9. 某跨界科技有限公司 冰箱智能化的食物标签方案分析
  10. 一次性删除EXCEL自定义样式方法