前言
北京时间2018年9月26日,Oracle官方宣布Java 11正式发布。这是Java大版本周期变化后的第一个长期支持版本,非常值得关注。从官网即可下载,最新发布的Java11将带来ZGC、Http Client等重要特性,一共包含17个JEP(JDK EnhancementProposals,JDK增强提案)。其实,总共更新不止17个,只是我们更关注如下的17个JEP更新。
JDK 11将是一个企业不可忽视的版本。从时间节点来看,JDK 11的发布正好处在JDK 8免费更新到期的前夕,同时JDK 9、10也陆续成为“历史版本”,下面是Oracle JDK支持路线图:
JDK 11是一个长期支持版本(LTS, Long-Term-Support)
对于企业来说,选择11将意味着长期的、可靠的、可预测的技术路线图。其中免费OpenJDK11确定将得到OpenJDK社区的长期支持,LTS版本将是可以放心选择的版本。
从JVM GC的角度,JDK11引入了两种新的GC,其中包括也许是划时代意义的ZGC,虽然其目前还是实验特性,但是从能力上来看,这是JDK的一个巨大突破,为特定生产环境的苛刻需求提供了一个可能的选择。例如,对部分企业核心存储等产品,如果能够保证不超过10ms的GC暂停,可靠性会上一个大的台阶,这是过去我们进行GC调优几乎做不到的,是能与不能的问题。
新的长期支持版本每三年发布一次,根据后续的发布计划,下一个长期支持版Java 17 将于2021年发布。
官网公开的17 个JEP(JDK Enhancement Proposal 特性增强提议)
181: Nest-Based Access Control(基于嵌套的访问控制) 309: Dynamic Class-File Constants(动态的类文件常量) 315: Improve Aarch64 Intrinsics(改进 Aarch64 Intrinsics) 318: Epsilon: A No-Op Garbage Collector(Epsilon 垃圾回收器,又被称为"No-Op(无操作)"回收器)320: Remove the Java EE and CORBA Modules(移除 Java EE 和 CORBA 模块,JavaFX 也已被移除)321: HTTP Client (Standard) 323: Local-Variable Syntax for Lambda Parameters(用于 Lambda 参数的局部变量语法) 324: Key Agreement with Curve25519 and Curve448(采用 Curve25519 和 Curve448 算法实现的密钥协议) 327: Unicode 10328: Flight Recorder(飞行记录仪) 329: ChaCha20 and Poly1305 Cryptographic Algorithms(实现 ChaCha20 和 Poly1305 加密算法) 330: Launch Single-File Source-Code Programs(启动单个 Java 源代码文件的程序) 331: Low-Overhead Heap Profiling(低开销的堆分配采样方法) 332: Transport Layer Security (TLS) 1.3(对 TLS 1.3 的支持) 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)(ZGC:可伸缩的低延迟垃圾回收器,处于实验性阶段) 335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎) 336: Deprecate the Pack200 Tools and API(弃用 Pack200 工具及其 API)
新增了一系列字符串处理方法
判断字符串是否为空白
" ".isBlank(); // true
去除首尾空白
" Javastack ".strip(); // "Javastack"
去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
去除首部空格
" Javastack ".stripLeading(); // "Javastack "
复制字符串
"Java".repeat(3);// "JavaJavaJava"
行数统计
"A\nB\nC".lines().count(); // 3
Optional 加强
Optional也增加了几个非常酷的方法,现在可以很方便的将一个Optional转换成一个Stream,或者当一个空Optional时给它一个替代的。
局部变量类型推断升级
在var上添加注解的语法格式,在jdk10中是不能实现的。在JDK11中加入了这样的语法。
//错误的形式: 必须要有类型, 可以加上var //Consumer con1 = (@Deprecated t) ->System.out.println(t.toUpperCase()); //正确的形式: //使用var的好处是在使用lambda表达式时给参数加上注解。 Consumer con2 = (@Deprecated var t) ->System.out.println(t.toUpperCase());