Hello——Java10新特性,请了解一下

2018年3月20日,Java 10 正式发布!

相关地址:

官方地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

Jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html

安装指南:https://docs.oracle.com/javase/10/install/overview-jdk-10-and-jre-10-installation.htm

Java现状:

1)据统计,目前90%的用户在使用Java8及以下版本(值得庆幸的是Java8已经成为主力军)。

2)在社区的不断刺激下,为了更快的迭代版本。官方将会在每年的3、9月进行版本升级(版本更新周期将会稳定在6个月)。

3)在最新的开发语言排行榜中,Java依然傲视群雄,稳居第一!

一、Java10中12项关键新特性

局部变量的类型推断

Java开始引用像脚本语言JavaScript中的var类型(弱类型),允许你通过var定义任何类型的变量。

对于开发人员来说,这是唯一和你密切相关的特性。它可以帮助你极大的简化代码。

有同学就会问了,var和Object有啥区别呢?

咱们举个栗子:

Object objList = new ArrayList<String>();
objList.add("hello,world!");//这句代码会出现编译异常

var varList = new ArrayList<String>();
varList.add("hello,world!");//而这句代码会编译通过

以上代码通过Java10编译时,第2行会出现异常(错误: 找不到符号),当然在Java10以下的版本也会编译异常。

但是通过var定义的变量却可以编译通过,为什么?因为var是一个类型引用对象,它和表达式右边的类型具有相同的属性。

即以下两句代码是对等的:

var varList = new ArrayList<String>();

ArrayList<String> varList = new ArrayList<String>();

应用类数据共享(CDS) 

CDS 在 JDK5 时被引进以改善 JVM 启动的表现,同时减少当多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。
  JDK10 将扩展 CDS 到允许内部系统的类加载器、内部平台的类加载器和自定义类加载器来加载获得的类。之前,CDS 的使用仅仅限制在了 bootstrap 的类加载器。

额外的 Unicode 语言标签扩展

  这将改善 java.util.Locale 类和相关的 API 以实现额外 BCP47 语言标签的 Unicode 扩展。尤其是,货币类型,一周的第一天,区域覆盖和时区等标签现在将被支持。

?基于时间的版本控制

我们的 JDK 版本字符串格式几乎与 JDK 版本一样多。幸运的是,这是最后需要使用到的,我们可以坚持用它。这种格式使用起来很像 JDK9 中介绍的提供一个更加语义的形式。有一件困扰我的事是包含了一个 INTERIM 元素,正如 JEP 提议中所说,“永远是0”。好吧,如果永远是0,那它有什么意义呢?他们说这是为未来使用做保留,但我仍不是很赞同。我认为,这有些冗余繁杂。
  这也消除了在 JDK9 中有过的相当奇怪的情形。第一次更新是 JDK 9.0.1 , 非常符合逻辑。第二次更新是 JDK 9.0.4 ,不合逻辑。原因是,在 JDK9 的版本计数模式下,需要留下空白以便应急或不在预期安排的更新使用。但既然没有更新是必须的,为什么不简单称之为 JDK 9.0.2 呢?

根证书

在 JDK 中将提供一套默认的 CA 根证书。关键的安全部件,如 TLS ,在 OpenJDK 构建中将默认有效。这是 Oracle 正在努力确保 OpenJDK 二进制和 Oracle JDK 二进制功能上一样的工作的一部分,是一项有用的补充内容。

并行全垃圾回收器 G1

G1 是设计来作为一种低延时的垃圾回收器(但是如果它跟不上旧的堆碎片产生的提升速率的话,将仍然采用完整压缩集合)。在 JDK9 之前,默认的收集器是并行,吞吐,收集器。为了减少在使用默认的收集器的应用性能配置文件的差异,G1 现在有一个并行完整收集机制。

移除 Native-Header 自动生成工具

Java9 开始了一些对 JDK 的家务管理,这项特性是对它的延续。当编译 JNI 代码时,已不再需要单独的工具来生成头文件,因为这可以通过 javac 完成。在未来的某一时刻,JNI 将会被 Panama 项目的结果取代,但是何时发生还不清楚。

垃圾回收器接口

这不是让开发者用来控制垃圾回收的接口;而是一个在 JVM 源代码中的允许另外的垃圾回收器快速方便的集成的接口。

线程-局部变量管控

这是在 JVM 内部相当低级别的更改,现在将允许在不运行全局虚拟机安全点的情况下实现线程回调。这将使得停止单个线程变得可能和便宜,而不是只能启用或停止所有线程。

在备用存储装置上的堆分配

硬件技术在持续进化,现在可以使用与传统 DRAM 具有相同接口和类似性能特点的非易失性 RAM 。这项 JEP 将使得 JVM 能够使用适用于不同类型的存储机制的堆。

? 试验性的基于 Java 的 JIT 编译器

最近宣布的 Metropolis 项目,提议用 Java 重写大部分 JVM 。乍一想,觉得很奇怪。如果 JVM 是用 Java 编写的,那么是否需要一个 JVM 来运行 JVM ? 相应的,这导致了一个很好的镜像类比。 现实情况是,使用 Java 编写 JVM 并不意味着必须将其编译为字节码,你可以使用 AOT 编译,然后在运行时编译代码以提高性能。

这项 JEP 将 Graal 编译器研究项目引入到 JDK 中。并给将 Metropolis 项目成为现实,使 JVM 性能与当前 C++ 所写版本匹敌(或有幸超越)提供基础。

合并 JDK 多个代码仓库到一个单独的储存库中

在 JDK9 中,有 8 个仓库: root、corba、hotspot、jaxp、jaxws、jdk、langtools 和 nashorn 。在 JDK10 中这些将被合并为一个,使得跨相互依赖的变更集的存储库运行 atomic commit (原子提交)成为可能。

二、新增API或函数

有 73 项新增内容添加到了标准类库中。

? java.awt.Toolkit:
  int getMenuShortcutKeyMaskEx(): 确定哪个扩展修饰符键是菜单快捷键的适当加速键。

? java.awt.geom.Path2D:
  void trimToSize(): 将此 Path2D 实例的容量计算到它当前的大小。应用可使用此操作将路径的存储空间最小化。这个方法也被添加到 Path2D.Double 和 Path2D.Float 类。

? java.io.ByteArrayOutputStream:
  String toString(Charset): 重载 toString(),通过使用指定的字符集解码字节,将缓冲区的内容转换为字符串。

? java.io.PrintStream:
  lang.io.PrintWriter:
  这两个类都有三个新的构造函数,它们需要额外的 Charset 参数。

? java.io.Reader:
  long transferTo(Writer): 从这个 Reader 中读取所有字符,并按照所读的顺序将字符写入给定的 Writer 。

? java.lang.Runtime.Version:
  有四种新方法返回新(JEP 322)版本字符串字段的整数值: feature()、interim()、patch()和 update()。

? java.lang.StackWalker.StackFrame:
  String getDescriptor(): 按照 JVM 标准返回此堆栈帧所代表的方法的描述符。
  String getMethodType(): 返回此堆栈帧所代表的方法类型,描述参数类型和返回值类型。

? java.lang.invoke.MethodType:
  Class<?> lastParameterType(): 返回这个方法类型的最后一个参数类型。如果这个方法类型没有参数,则返回空类型作为岗哨值(Sentinel Value)。

? java.lang.management.RuntimeMXBean:
  long getPid():  返回正在运行的 JVM 的进程 ID 。

? java.lang.management.ThreadMXBean:
  ThreadInfo[] dumpAllThreads(boolean, boolean, int): 返回所有活动线程的线程信息,其中有指定的最大元素数量和同步信息的堆栈跟踪。
  ThreadInfo[] getThreadInfo(long[], boolean, boolean, int): 返回每个线程的线程信息,这些线程的标识位于输入数组中,其中有指定的最大元素数量和同步信息的堆栈跟踪。

? java.lang.reflect.MalformedParameterizedTypeException:

添加了一个新的构造函数,它以字符串的形式作为参数来获取详细信息。

? java.net.URLDecoder:
  java.net.URLEncoder:
  这两个类都有新的重载的解码和编码方法,将 charset 作为附加参数。

? java.nio.channels.Channels:
  两个新的静态重载方法,允许使用 Charset 的 newReader(ReadByteChannel,Charset)和newWriter(WriteByteChannel,Charset)。

? java.nio.file.FileStore:
  long getBlockSize(): 在这个文件存储中返回每个块的字节数。

? java.time.chrono.HijrahEra:

  java.time.chrono.MiinguoEra:

  java.time.chrono.ThaiBuddhistEra:
  String getDisplayName(TextStyle, Locale): 这将返回用于识别 era 的文本名称,适合于向用户展示。

? java.time.format.DateTimeFormatter:
  localizedBy(Locale): 返回指定格式器的一个副本,其中包含地区、日历、区域、小数和/或时区的本地化值,这将取代该格式器中的值。

? java.util.DoubleSummaryStatistics:

  java.util.IntSummaryStatistics:

  java.util.LongSummaryStatistics:

这3个类增加了一个新的构造函数,它包含 4 个数值。它使用指定的计数、最小值、最大值和总和构造一个非空实例。

? java.util.List:
  java.util.Map:
  java.util.Set:

这3个接口都增加了一个新的静态方法,copyOf(Collection)。这些函数按照其迭代顺序返回一个不可修改的列表、映射或包含给定集合的元素的集合。

? java.util.Optional:
  java.util.OptionalDouble:
  java.util.OptionalInt:
  java.util.OptionalLong: 这些类都增加了一个新的方法orElseThrow()。它本质上和 get()一样,也就是说,如果 Optional 有值则返回。否则,将抛出 NoSuchElementException 。

? java.util.Formatter:
  java.util.Scanner:
  这两个类都有三个新的构造函数,除了其他参数之外,它们都带有一个 charset 参数。

? java.util.Properties:

增加了一个新的构造函数,它接受一个 int 参数。这将创建一个没有默认值的空属性列表,并且指定初始大小以容纳指定的元素数量,而无需动态调整大小。还有一个新的重载的 replace 方法,接受三个 Object 参数并返回一个布尔值。只有在当前映射到指定值时,才会替换指定键的条目。

? java.SplittableRandom:
  void nextBytes(byte[]): 用生成的伪随机字节填充一个用户提供的字节数组。

? java.util.concurrent.FutureTask:

添加了 toString()方法,该方法返回一个标识 FutureTask 的字符串,以及它的完成状态。在括号中,状态包含如下字符串中的一个,“Completed Normally” 、“Completed Exceptionally”、 “Cancelled” 或者 “Not completed”。

? java.util.concurrent.locks.StampedLock:
  boolean isLockStamp(long): 返回一个标记戳表示是否持有一个锁。
  boolean isOptimisticReadStamp(long): 返回一个标记戳代表是否成功的进行了乐观读(optimistic read)。
  boolean isReadLockStamp(long): 返回一个标记戳表示是否持有一个非独占锁(即 read lock )。
  boolean isWriteLockStamp(long): 返回一个标记戳表示是否持有一个独占锁(即 write lock )。

? java.jar.JarEntry:
  String getRealName(): 返回这个 JarEntry 的真实名称。如果这个 JarEntry 是一个多版本 jar 文件的入口,它被配置为这样处理,这个方法返回的名字是 JarEntry 所代表的版本条目的入口,而不是 ZipEntry.getName()返回的基本条目的路径名。如果 JarEntry 不代表一个多版本 jar 文件的版本化条目或者 jar 文件没有被配置为作为一个多版本 jar 文件进行处理,这个方法将返回与 ZipEntry.getName()返回的相同名称。

? java.util.jar.JarFile:
  Stream<JarEntry> versionedStream(): 返回 jar 文件中指定版本的入口对应 Stream 。与 JarEntry 的 getRealName 方法类似,这与多版本 jar 文件有关。

? java.util.spi.LocaleNameProvider:
  getDisplayUnicodeExtensionKey(String, Locale): 为给定的 Unicode 扩展键返回一个本地化名称。
  getDisplayUnicodeExtensionType(String, String, Locale): 为给定的 Unicode 扩展键返回一个本地化名称。

? java.util.stream.Collectors:
  toUnmodifiableList():
  toUnmodifiableSet():
  toUnmodifiableMap(Function, Function):
  toUnmodifiableMap(Function, Function, BinaryOperator):

这四个新方法都返回 Collectors ,将输入元素聚集到适当的不可修改的集合中。

? java.lang.model.SourceVersion:

现在有了一个字段,它代表了 JDK 10 的版本。

? java.lang.model.util.TypeKindVisitor6:
  javax.lang.model.util.TypeKindVisitor9:
  R visitNoTypeAsModule(NoType, P): 访问一个 MODULE 的 pseudo-type 。不清楚为什么 Visitor7 和 Visitor8 没有这个方法。

? javax.remote.management.rmi.RMIConnectorServer:
  这个类添加了两个字段: CREDENTIALS_FILTER_PATTERN 和 SERIAL_FILTER_PATTERN 。

? javax.ButtonModel:
  ButtonGroup getGroup(): 返回按钮所属的组。通常用于单选按钮,它们在组中是互斥的。

? javax.plaf.basic.BasicMenuUI:
  Dimension getMinimumSize(JComponent): 返回指定组件适合观感的最小大小。

三、其他

?  如果 Kerberos 的配置文件 krb5.conf 包含一个 INCLUDEDIR 选项,那么在 INCLUDEDIR 这个目录下所有以 .conf 结尾的文件都会被默认加载进来。

?  以前版本中已经过期的 Java 的启动选项 -d32 和 –d64 在当前版本已经被移除。如果你在新的版本里仍然使用了这两个选项,JVM 将无法正常启动。

?  JDK10 支持 JDK9 中的新版本 Doclet,JDK6、JDK7、JDK8 中的 Doclet 版本都不再支持。

?  JDK10 重新启用了在 JDK9 中被不当过时的 newFactory() 方法。

?  JDK10 引入了一个新的 Javadoc 标签: {@summary…},解决了以前版本无法生成 API 摘要的问题。

?  JDK10 去掉了 BiasedLockingStartupDelay 的 4 秒启动延时。

?  以下在 com.sun.security.auth 包中的过时的类在新版本中都已经被移除:

PolicyFile

SolarisNumericGroupPrincipal

SolarisNumericUserPrincipal

X500Principal

SolarisLoginModule

SolarisSystem

?  在 java.lang.SecurityManager 类中的以下属性和方法(从 JDK 1.2 就已经过时)终于被移除了:

inCheck (属性)

getInCheck

classDepth

classLoaderDepth

currentClassLoader

currentLoadedClass

inClass

inClassLoader

?  以下 java.lang.Runtime 类中已经被废弃的国际化方法在新版本被移除:

getLocalizedInputStream

getLocalizedOutputStream

?  以下废弃的 Hotspot –X 选项在新版本中被移除:-Xoss, -Xsqnopause, -Xoptimize, -Xboundthreads and –Xusealtsigs.

?  policytool 在新版本中被移除。

?  javadoc 工具在新版本中可以通过 –add-stylesheets 命令选项支持多个 stylesheets 。

?  新版本的 JVM 能够根据系统分配给当前 Docker 容器的 CPU 数和内存来配置线程池和 GC 机制,而不再是直接使用系统的 CPU 和内存。并且增加了三个更强大的命令选项:-XX:InitialRAMPercentage、-XX:MaxRAMPercentage 和 -XX:MinRAMPercentage 。

?  新版本增加了一个新的系统属性:jdk.disableLastUsageTracking。这个新增的属性就像它的名字一样,会禁用 JRE 的上一次使用跟踪。

综上所述,可以看到JDK的每个版本升级都会对我们或多或少的影响,我们需要不断学习新技术,接受新的思维模式。

当然JDK一些内部的优化,对开发人员来说是透明的。它在不断变强大的同时,还在优化提升性能、安全性、稳定性。

Java10已经来了,那么Java11还会远吗?我们9月,不见不散!

原文地址:https://www.cnblogs.com/skychenjiajun/p/8875456.html

时间: 2024-07-30 07:18:03

Hello——Java10新特性,请了解一下的相关文章

java10 新特性 详解

引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为null,因为不能判断具体类型,会报异常. @Test public void test1(){ var number = 10; var str = "i like java"; var list = new ArrayList<>(); var map = new Hash

JAVA8,JAVA9,JAVA10,JAVA11,Spring5新特性原理原理与实践

Java10它号称有109项新特性,包含12个JEP. 需要注意的是,本次Java10并不是Oracle的官方LTS版本,所以咱们可以先了解新特性.然后坐等java11的发布再考虑在生产中使用吧 特性列表 局部变量的类型推断 var关键字GC改进和内存管理 并行全垃圾回收器 G1垃圾回收器接口线程-局部变量管控合并 JDK 多个代码仓库到一个单独的储存库中新增API:ByteArrayOutputStream新增API:List.Map.Set新增API:java.util.Properties

Java11新特性解读

在去年的9月26日,Oracle官方宣布Java11正式发布,这是Java大版本周期变化后的第一个长期支持版本,非常值得关注.Java9和Java10都在很短的时间内就过渡了,所以,Java11将是一个不可忽视的版本.从时间节点看,JDK11的发布正好处在JDK8免费更新到期的前夕,同时,JDK8.9也将陆续成为"历史版本". 那么,关于Java11的新特性到底有哪些呢?容我一一介绍. 局部类型推断 什么是局部类型推断? var str = "helloworld"

java 各版本新特性

Java 5,6,7,8,9,10,11新特性吐血总结 lkd_whh关注赞赏支持 12018.04.01 14:09:15字数 1,948阅读 10,615 作者:拔剑少年 简书地址:https://www.jianshu.com/u/dad4d9675892 博客地址:https://it18monkey.github.io 转载请注明出处 java5 泛型 (Generics) List<Integer> list=new ArrayList<Integer>(); 增强循环

Atitit js es5 es6新特性 attilax总结

1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 基本chrome ff 360se8全面支持了2 2. ECMAScript 2015(ES6)的十大特征 – WEB前端开发 - 专注前端开发,关注用户体验.html2 1.1. JavaScript发展时间轴: 1.1995:JavaScript诞生,它的初始名叫LiveScript. 2.1997:ECMAScript标准确立. 3.1999:ES3出

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.

Atitit.mysql&#160;5.0&#160;5.5&#160;&#160;5.6&#160;5.7&#160;&#160;新特性&#160;新功能

Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 memcached API 直接访问 NoSQL2 1.4. 更好的复制2 1.5. Performance Schema2 2. MySQL 5.7.62 2.1. 内建中文全文索引2 2.2. 多主复制2 2.3. other2 3. 参考2 1. MySQL  5.6    5 大新特性 M

atitit.Windows Server 2003 2008 2012系统的新特性 attilax 总结

atitit.Windows Server 2003  2008  2012系统的新特性 attilax 总结 1. Windows Server 2008 新特性也可以归纳为4个方面. 1 2. 相比Windows Server 08,R2 2 3. win 2012  新特性 2 4. 参考 6 1. Windows Server 2008 新特性也可以归纳为4个方面. 即将发布的Windows Server 2008是企业级的应用平台,可以为CRM等企业级应用提供更好更强的支撑,其新特性也

浅析Android 5.0中多媒体相关的新特性

本文来源于本人在所属公司内部分享的一次培训内容,由于100%是AOSP开源内容,所以应该可以分享出来给大家. Android L是在今年2014年6月的Google I/O开发者大会上正式推出的,其中包含了诸多改进,包括新的Material Design交互设计,卡片式风格的通知栏,对64位和ART的支持等等,本文则重点关注一些多媒体相关的新特性. 由于Android L发布的时间仅有半年,无论国内还是国外的相关资料比较匮乏,很多内容本人只能是在Android developer网站中对L版本的