2018年9月25日,Oracle正式发布了Java 11。不同于Java 9与Java 10的是,Java 11是一个LTS(长期支持)的版本,Oracle表示会对Java 11提供大力支持,将会持续至2026年9月。
上一个LTS的版本是Java 8,Java 8将会支持到2025年。而且Java 8是一个改动较大的版本,相比于Java 7增加了很多新特性。所以很多企业目前使用的Java版本都是Java 8。
而Java 11作为下一个LTS版本,是绝对值得学习和尝试使用的。那Java 11相对与Java8有哪些主要的改动呢?
使用var关键字来声明变量,编译器会自动推断类型。这是Java 10带来的特性比如:
// 使用String声明
String redSpider = "RedSpider";
// 使用var声明
var redSpider = "RedSpider";var只是一个语法糖,如果你查看上述代码编译而成的字节码,会发现它们是一模一样的。var关键字会被Java编译器编译为String。
而Java 11对var进行了增强,使它能够用在lambda表达式的局部变量声明中。
list.stream()
.map((var s) -> s.toLowerCase())
.collect(Collectors.toList());当然,上述代码其实是可以简写成下面这种形式的:
list.stream()
.map(s -> s.toLowerCase())
.collect(Collectors.toList());那var在lambda里有什么用?有一种情况是你需要在lambda里变量声明的时候使用注解的时候,这个时候就可以使用var了。比如:
list.stream()
.map((@Notnull var s) -> s.toLowerCase())
.collect(Collectors.toList());在以前,我们运行一个Java程序,需要先用javac编译成class文件,然后使用java命令去运行。而在Java 11中,我们只需要一行java命令就可以搞定:
java -classpath /home/foo/java Hello.java RedSpider
# 等价于以前的
javac -classpath /home/foo/java Hello.java
java -classpath /home/foo/java Hello RedSpider在JDK 9的时候,就提供了一些API用于HTTP客户端支持HTTP 2JEP 110。但这些API是放在incubator module里面的,开发者可以试用这些API并提出改进意见(这些API在JDK 10中有所更新)。而在JDK 11中,它们被加入到了Java SE 11标准库中。
它们在java.net.http包中,主要有以下类:
- HttpClient
- HttpRequest
- HttpResponse
- WebSocket
它们提供了一些支持同步和异步的方法。
从Java 9开始,就提议要把rt.jar分成不同的模块。在Java SE 11标准库中,移除了java.se.ee下面的6个模块。它们分别是:
- corba
- transaction
- activation
- xml.bind
- xml.ws
- xml.ws.annotation
有许多的API更新。这里挑几个大家可能常用的。
String添加了几个常用的用于处理字符串的API
- boolean isBlank(): 如果字符串是null或者是"",返回true,否则返回false
- Stream lines():返回这个字符串的函数。分隔符默认为""
- String repeat(int):返回原字符串重复几次的新字符串。比如"ab".repeat(3),返回"ababab"。
- String strip(): 去掉头尾的空白符,返回一个新的字符串
- String stripLeading(): 去掉头部的空白符
- String stripTrainling(): 去掉尾部的空白符
你可能会问,strip()和trim()用什么区别?一句话,strip()是trim()用于支持Unicode的进化版。详情查看:Difference between String trim() and strip() methods in Java 11。
这两个类都新加了一个compareTo()方法,这个方法和CharSequence类新增的**int compare(CharSequence, CharSequence)**方法类似。两个CharSequence从第一个字符开始比较每个字符,然后返回一个int值。
移除了两个臭名昭著的方法:destroy()和stop(Throwable)。撒花,庆祝...
还有IO、java.security、Optional等有一些更新。具体可以查看参考文章。
这绝对是让你的企业升级到Java 11的最大动力!ZGC是一款号称可以保证每次GC的停顿时间不超过10MS的垃圾回收器,并且和当前的默认垃圾回收起G1相比,吞吐量下降不超过15%。
请注意关键词,“不超过”,“10ms”。我只能说,Amazing!
后续本公众号会出一篇GC方面的文章,到时候会详细介绍ZGC。
Java 11还加入了一个比较特殊的垃圾回收器——Epsilon,该垃圾收集器被称为“no-op”收集器,将会处理内存分配而不做任何实际的内存回收。 也就是说,这是一款不做垃圾回收的垃圾回收器。这个垃圾回收器看起来并没什么用,主要可以用来进行性能测试、内存压力测试等,Epsilon GC可以作为度量其他垃圾回收器性能的对照组。Epsilon GC至少能够帮助理解GC的接口,有助于成就一个更加模块化的JVM。