发布倒计时!JDK11为我们带来哪些新特性?

by admin on 2020年3月25日

就在前两天,JDK 11 进入 Rampdown Phase Two
。之前的第一阶段持续一个月,主要修复 P1-P3
级错误;进入第二阶段后,将主要修复
P1-P2 级错误,并遵循 JEP 3 进行改进:

  今年7月底,JDK11已经进入了Rampdown Phase
Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中。

JDK Version 1.0

1996-01-23Oak

初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢。

  • RDP 1 candidate bugs

  • RDP 2 candidate bugs

  • Bug-Deferral
    Process

  • Late-Enhancement Request
    Process

  这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今年9月25日发布。确定发布的17个JEP如下,其中包括14个新特性以及3个移除的功能:

JDK Version 1.1

1997-02-19

  • JDBC(Java DataBase Connectivity);
  • 支持内部类;
  • RMI(Remote Method Invocation) ;
  • 反射;
  • Java Bean;

随着时间的临近,再有两个预览版本,JDK 11 就将迎来正式版本。

  181: Nest-Based Access
Control(基于嵌套的访问控制)
  309:
Dynamic Class-File Constants(动态类文件常量)
  315:
Improve Aarch64 Intrinsics(改进 Aarch64 Intrinsics)
  318:
Epsilon: A No-Op Garbage Collector(Epsilon —
一个无操作的垃圾收集器)

JDK Version 1.2

1998-12-08 Playground

  • 集合框架;
  • JIT(Just In Time)编译器;
  • 对打包的Java文件进行数字签名;
  • JFC(Java Foundation Classes), 包括Swing 1.0, 拖放和Java2D类库;
  • Java插件;
  • JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型;
  • Applet中添加声音支持.

图片 1

  321: HTTP Client
(Standard)(标准HTTP客户端)

JDK Version 1.3

2000-05-08Kestrel

  • Java Sound API;
  • jar文件索引;
  • 对Java的各个方面都做了大量优化和增强;

JDK 11 总共包含 17 个新的 JEP ,分别为:

  323: Local-Variable
Syntax for Lambda Parameters(用于 Lambda
参数的局部变量语法)

JDK Version 1.4

2004-02-06Merlin

  • XML处理;
  • Java打印服务;
  • Logging API;
  • Java Web Start;
  • JDBC 3.0 API;
  • 断言;
  • Preferences API;
  • 链式异常处理;
  • 支持IPV6;
  • 支持正则表达式;
  • 引入Imgae I/O API.
  • 181: Nest-Based Access
    Control(基于嵌套的访问控制)

  • 309: Dynamic Class-File
    Constants(动态类文件常量)

  • 315: Improve Aarch64
    Intrinsics(改进 Aarch64
    Intrinsics)

  • 318: Epsilon: A No-Op Garbage
    Collector(Epsilon —
    一个无操作的垃圾收集器)

  • 320: Remove the Java EE and CORBA
    Modules(删除 Java EE 和 CORBA
    模块)

  • 321: HTTP Client (Standard)

  • 323: Local-Variable Syntax for Lambda
    Parameters(用于 Lambda
    参数的局部变量语法)

  • 324: Key Agreement with Curve25519 and
    Curve448(Curve25519 和 Curve448 算法的密钥协议)

  • 327: Unicode 10

  • 328: Flight Recorder

  • 329: ChaCha20 and Poly1305 Cryptographic
    Algorithms(ChaCha20 和 Poly1305
    加密算法)

  • 330: Launch Single-File Source-Code
    Programs(启动单一文件的源代码程序)

  • 331: Low-Overhead Heap
    Profiling(低开销的 Heap
    Profiling)

  • 332: Transport Layer Security (TLS)
    1.3(支持 TLS 1.3)

  • 333: ZGC: A Scalable Low-Latency Garbage
    Collector (Experimental) (可伸缩低延迟垃圾收集器)

  • 335: Deprecate the Nashorn JavaScript
    Engine(弃用 Nashorn JavaScript
    引擎)

  • 336: Deprecate the Pack200 Tools and
    API (弃用 Pack200 工具和 API)

  jdk10中带来了var隐式变量声明,如:

JAVA 5

2004-09-30Tiger

  • 泛型;
  • 增强循环,可以使用迭代方式;
  • 自动装箱与自动拆箱;
  • 类型安全的枚举;
  • 可变参数;
  • 静态引入;
  • 元数据;
  • Instrumentation;

(文/开源中国)    

var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...

JAVA 6

2006-12-11Mustang

  • 支持脚本语言;
  • JDBC 4.0API;
  • Java Compiler API;
  • 可插拔注解;
  • 增加对Native PKI(Public Key Infrastructure), Java GSS(Generic
    Security Service),Kerberos和LDAP(Lightweight Directory Access
    Protocol)支持;
  • 继承Web Services;

jdk11中将允许在声明隐式类型的 lambda
表达式的形式参数时使用 var,如:

JAVA 7

2011-07-28Dolphin

  • switch语句块中允许以字符串作为分支条件;
  • 在创建泛型对象时应用类型推断;
  • 在一个语句块中捕获多种异常;
  • 支持动态语言;
  • 支持try-with-resources(在一个语句块中捕获多种异常);
  • 引入Java NIO.2开发包;
  • 数值类型可以用二进制字符串表示,并且可以在字符串表示中添加下划线;
  • 钻石型语法(在创建泛型对象时应用类型推断);
  • null值得自动处理;
(var x, var y) -> x.process(y)

JAVA 8

2014-03-18

  • Lambda 表达式
    Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。

  • 方法引用
    方法引用提供了非常有用的语法,可以直接引用已有Java类或对象的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 默认方法− 默认方法就是一个在接口里面有了一个实现的方法。

  • 新工具− 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

  • Stream API−新添加的Stream API(java.util.stream)
    把真正的函数式编程风格引入到Java中。

  • Date Time API− 加强对日期与时间的处理。

  • Optional 类− Optional 类已经成为 Java 8
    类库的一部分,用来解决空指针异常。

  • Nashorn, JavaScript 引擎− Java 8提供了一个新的Nashorn
    javascript引擎,它允许我们在JVM上运行特定的javascript应用。

  • 详细参考:

  或者干脆省略掉var符号

JAVA 9

2017-09-22

  • 模块系统:模块是一个包的容器,Java 9
    最大的变化之一是引入了模块系统(Jigsaw 项目)。
  • REPL :交互式编程环境。
  • HTTP 2 客户端:HTTP/2标准是HTTP协议的最新版本,新的 HTTPClient
    API 支持 WebSocket 和 HTTP2 流以及服务器推送特性。
  • 改进的 Javadoc:Javadoc 现在支持在 API
    文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。
  • 多版本兼容 JAR 包:多版本兼容 JAR 功能能让你创建仅在特定版本的
    Java 环境中运行库程序时选择使用的 class 版本。
  • 集合工厂方法:List,Set 和 Map
    接口中,新的静态工厂方法可以创建这些集合的不可变实例。
  • 私有接口方法:在接口中使用private私有方法。我们可以使用 private
    访问修饰符在接口中编写私有方法。
  • 进程 API: 改进的 API 来控制和管理操作系统进程。引进
    java.lang.ProcessHandle 及其嵌套接口 Info
    来让开发者逃离时常因为要获取一个本地进程的 PID
    而不得不使用本地代码的窘境。
  • 改进的 Stream API:改进的 Stream API
    添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。
  • 改进 try-with-resources:如果你已经有一个资源是 final 或等效于
    final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在
    try-with-resources 语句中声明一个新变量。
  • 改进的弃用注解 @Deprecated:注解 @Deprecated 可以标记 Java API
    状态,可以表示被标记的 API 将会被移除,或者已经破坏。
  • 改进钻石操作符(Diamond
    Operator)
    :匿名类可以使用钻石操作符(Diamond Operator)。
  • 改进 Optional 类:java.util.Optional
    添加了很多新的有用方法,Optional 可以直接转为 stream。
  • 多分辨率图像
    API
    :定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了。
  • 改进的 CompletableFuture API: CompletableFuture
    类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作。
  • 轻量级的 JSON API:内置了一个轻量级的JSON API
  • 响应式流(Reactive Streams) API: Java 9中引入了新的响应式流 API
    来支持 Java 9 中的响应式编程。
  • 详细参考:
(x, y) -> x.process(y)

JAVA 10

2018-03-21

根据官网的公开资料,共有12个重要特性,如下:

  • JEP286,var 局部变量类型推断。
  • JEP296,将原来用 Mercurial 管理的众多 JDK
    仓库代码,合并到一个仓库中,简化开发和管理过程。
  • JEP304,统一的垃圾回收接口。
  • JEP307,G1
    垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
  • JEP310,应用程序类数据
    共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。
  • JEP312,ThreadLocal 握手交互。在不进入到全局 JVM 安全点 (Safepoint)
    的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。
  • JEP313,移除 JDK 中附带的 javah 工具。可以使用 javac -h 代替。
  • JEP314,使用附加的 Unicode 语言标记扩展。
  • JEP317,能将堆内存占用分配给用户指定的备用内存设备。
  • JEP317,使用 Graal 基于 Java 的编译器,可以预先把 Java
    代码编译成本地代码来提升效能。
  • JEP318,在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前
    Oracle 提供的的 Java SE 的根证书,这样 OpenJDK
    对开发人员使用起来更方便。
  • JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为$FEATURE.$INTERIM.$UPDATE.$PATCH,分别是大版本,中间版本,升级包和补丁版本。

324:
Key Agreement with Curve25519 and Curve448(Curve25519 和 Curve448
算法的密钥协议)
327:
Unicode 10
328:
Flight Recorder(飞行记录器)

JAVA 11

2018-09-25

翻译后的新特性有:

  • 181:Nest-Based访问控制
  • 309:动态类文件常量
  • 315:改善Aarch64 intrinsic
  • 318:无操作垃圾收集器
  • 320:消除Java EE和CORBA模块
  • 321:HTTP客户端
  • 323:局部变量的语法λ参数
  • 324:Curve25519和Curve448关键协议
  • 327:Unicode 10
  • 328:飞行记录器
  • 329:ChaCha20和Poly1305加密算法
  • 330:发射一列纵队源代码程序
  • 331:低开销堆分析
  • 332:传输层安全性(Transport Layer Security,TLS)1.3
  • 333:动作:一个可伸缩的低延迟垃圾收集器
  • 335:反对Nashorn JavaScript引擎
  • 336:反对Pack200工具和API

——————— 本文来自 ranyuangang 的CSDN 博客
,全文地址请点击:

  ”飞行记录器”旨在“提供一个低开销的数据收集框架,用于对Java应用程序和HotSpot
JVM进行故障诊断”。

329:
ChaCha20 and Poly1305 
Cryptographic
Algorithms(ChaCha20 和 Poly1305 加密算法)
330:
Launch Single-File Source-Code
Programs(启动单一文件的源代码程序)

  主要是改进 Java
Launcher 以支持一个命令执行单个 Java
源代码文件。换句话说,在条件满足的情况下,可以简单地直接编译并运行单文件程序,而不再需要调用
javac ,也不需要打包 jar 文件。

  比如说,可直接运行:

java HelloWorld.java

而不再需要:

javac -d <memory> HelloWorld.java
java -cp <memory> hello.World

 

331:
Low-Overhead Heap Profiling(低开销的 Heap Profiling)
332:
Transport Layer Security (TLS) 1.3(支持 TLS 1.3)
333:
ZGC: A Scalable Low-Latency Garbage
Collector(可伸缩低延迟垃圾收集器)

  上一代的垃圾回收器G1已经足够强大,但是,ZGC可能会更加惊艳,ZGC的一个目标是将垃圾回收的暂停时间压缩到10ms之内,这意味着Java可以成为应用到更广泛的领域。官方文档提供了ZGC与G1的benchmarks测试对比,我们看到对比G1的156.806ms平均时间,ZGC的垃圾收集时间低至1.091ms

ZGC
                avg: 1.091ms (+/-0.215ms)
    95th percentile: 1.380ms
    99th percentile: 1.512ms
  99.9th percentile: 1.663ms
 99.99th percentile: 1.681ms
                max: 1.681ms

G1
                avg: 156.806ms (+/-71.126ms)
    95th percentile: 316.672ms
    99th percentile: 428.095ms
  99.9th percentile: 543.846ms
 99.99th percentile: 543.846ms
                max: 543.846ms

320:
Remove the Java EE and CORBA Modules(删除 Java EE 和 CORBA
模块)
335:
Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript
引擎)
336:
Deprecate the Pack200 Tools and API(弃用 Pack200 工具和 API)

此外,还有一些除 JEP
之外的API变化,比较实用的有以下几个:

String

  • lines()

  字符串实例方法,使用专门的
Spliterator 来懒惰地提供源字符串中的行

jshell> "testnhogen".lines().map(String::toUpperCase).toArray()
$11 ==> Object[2] { "TEST", "HOGE" }
  • repeat(int)

  按照参数 int
提供的次数来重复字符串的运行次数

jshell> "test".repeat(3) $7 ==> "testtesttest"
  • isBlank()  

  验证当前字符串是否为空,或者是否只包括空白字符(空白字符由
Character.isWhiteSpace(int) 验证)

jshell> var halfSpace = "u0020"
halfSpace ==> " "

jshell> halfSpace.isBlank()
$11 ==> true

jshell> var fullSpace = "u3000"
fullSpace ==> " "

jshell> fullSpace.isBlank()
$13 ==> true
  • strip()/stripLeading()/stripTrailing()

  这三个方法的作用分别是去掉字符串头和尾的空白符、字符串头的空白符、字符串尾的空白符,基本与
trim()/trimLeft()/trimRight() 方法相同,不过它们的空白字符由
Character.isWhiteSpace(int) 验证

jshell> var aaa = fullSpace + "aaa" + fullSpace
aaa ==> " aaa "

jshell> aaa.strip()
$14 ==> "aaa"

jshell> aaa.trim()
$15 ==> " aaa "

Character

  • toString(int)

  JDK 11
使这个过程变得更加方便

jdk10:
jshell> Character.toString(65)
|  Error:
|  incompatible types: possible lossy conversion from int to char
|  Character.toString(65)
|

jdk11:
jshell> Character.toString(65)
$9 ==> "A"

Path

  • of(String,
    String…)

  此前我们需要使用
Paths.get()。现在,我们像其他类一样使用 of()。

Files

  • writeString(Path,
    CharSequence)

  我们可以使用该方法来保存一个
String 字符串。

jshell> Files.writeString(Path.of("test.txt"), "Hello!!!")
$3 ==> test.txt
  • readString(Path)

  我们可以使用该方法来读取一个
String 字符串。

jshell> Files.readString(Path.of("test.txt"))
$4 ==> "Hello!!!"

Collection

  • toArray(IntFunction)

此前,我们需要使用像
list.toArray(new String[list.size())]) 这样的无风格标记(non-stylish
notation)来从一个集合创建一个类型化数组。现在,我们可以以风格标记(stylish
notation)的方式进行编写。

jshell> List.of("aa","bb").toArray(String[]::new) $1 ==> String[2] { "aa", "bb" }

Thread

  • destroy()/stop(Throwable)

  移除 destroy()
方法,保留 stop() 方法。

 

  Java
9以来,oracle实行了半年一次版本的新计划,很多同学说
9未掌握10刚了解11已进冻结期,
  你呢?

 

参考资料:

 

图片 2

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图