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有啥区别呢? 咱们举个栗子:
以上代码通过Java10编译时,第2行会出现异常(错误: 找不到符号),当然在Java10以下的版本也会编译异常。 但是通过var定义的变量却可以编译通过,为什么?因为var是一个类型引用对象,它和表达式右边的类型具有相同的属性。 即以下两句代码是对等的:
✔ 应用类数据共享(CDS) CDS 在 JDK5 时被引进以改善 JVM 启动的表现,同时减少当多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。
✔ 额外的 Unicode 语言标签扩展 这将改善 java.util.Locale 类和相关的 API 以实现额外 BCP47 语言标签的 Unicode 扩展。尤其是,货币类型,一周的第一天,区域覆盖和时区等标签现在将被支持。
✔基于时间的版本控制 我们的 JDK 版本字符串格式几乎与 JDK 版本一样多。幸运的是,这是最后需要使用到的,我们可以坚持用它。这种格式使用起来很像 JDK9 中介绍的提供一个更加语义的形式。有一件困扰我的事是包含了一个 INTERIM 元素,正如 JEP 提议中所说,“永远是0”。好吧,如果永远是0,那它有什么意义呢?他们说这是为未来使用做保留,但我仍不是很赞同。我认为,这有些冗余繁杂。
✔ 根证书 在 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:
▪ java.awt.geom.Path2D:
▪ java.io.ByteArrayOutputStream:
▪ java.io.PrintStream:
▪ java.io.Reader:
▪ java.lang.Runtime.Version:
▪ java.lang.StackWalker.StackFrame:
▪ java.lang.invoke.MethodType:
▪ java.lang.management.RuntimeMXBean:
▪ java.lang.management.ThreadMXBean:
▪ java.lang.reflect.MalformedParameterizedTypeException: 添加了一个新的构造函数,它以字符串的形式作为参数来获取详细信息。
▪ java.net.URLDecoder:
▪ java.nio.channels.Channels:
▪ java.nio.file.FileStore:
▪ java.time.chrono.HijrahEra: java.time.chrono.MiinguoEra: java.time.chrono.ThaiBuddhistEra:
▪ java.time.format.DateTimeFormatter:
▪ java.util.DoubleSummaryStatistics: java.util.IntSummaryStatistics: java.util.LongSummaryStatistics: 这3个类增加了一个新的构造函数,它包含 4 个数值。它使用指定的计数、最小值、最大值和总和构造一个非空实例。
▪ java.util.List: 这3个接口都增加了一个新的静态方法,copyOf(Collection)。这些函数按照其迭代顺序返回一个不可修改的列表、映射或包含给定集合的元素的集合。
▪ java.util.Optional:
▪ java.util.Formatter:
▪ java.util.Properties: 增加了一个新的构造函数,它接受一个 int 参数。这将创建一个没有默认值的空属性列表,并且指定初始大小以容纳指定的元素数量,而无需动态调整大小。还有一个新的重载的 replace 方法,接受三个 Object 参数并返回一个布尔值。只有在当前映射到指定值时,才会替换指定键的条目。
▪ java.SplittableRandom:
▪ java.util.concurrent.FutureTask: 添加了 toString()方法,该方法返回一个标识 FutureTask 的字符串,以及它的完成状态。在括号中,状态包含如下字符串中的一个,“Completed Normally” 、“Completed Exceptionally”、 “Cancelled” 或者 “Not completed”。
▪ java.util.concurrent.locks.StampedLock:
▪ java.jar.JarEntry:
▪ java.util.jar.JarFile:
▪ java.util.spi.LocaleNameProvider:
▪ java.util.stream.Collectors: 这四个新方法都返回 Collectors ,将输入元素聚集到适当的不可修改的集合中。
▪ java.lang.model.SourceVersion: 现在有了一个字段,它代表了 JDK 10 的版本。
▪ java.lang.model.util.TypeKindVisitor6:
▪ javax.remote.management.rmi.RMIConnectorServer:
▪ javax.ButtonModel:
▪ javax.plaf.basic.BasicMenuUI:
三、其他 ▪ 如果 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月,不见不散!
|
|
来自: 昵称58404772 > 《Java学习资料》