Java程序员必须了解:Java11的重要性及新特性一览

一、Java11的重要性

Java 11于2018年9月26日发布,是继Java 8之后的第二个LTS版本。从Java 11以后,Oracle JDK将不再免费用于商业用途。

可以在开发阶段免费使用,但要如果要在商业上使用它,必须购买许可证。否则随时可能从Oracle获得发票账单!

Java 10是可以下载的最后一个免费的Oracle JDK。

Oracle从2019年4月开始停止Java 8免费支持。您需要支付费用如果需要更多支持,可以继续使用老版本,但不会获得任何补丁/安全更新。

从Java 11以后,Oracle不会为任何单个Java版本提供免费的长期支持(LTS)。

虽然Oracle JDK不再免费,但是始终可以从Oracle或其他提供商(如AdoptOpenJDK,Azul,IBM,Red Hat等)下载Open JDK版本。

您可以从https://jdk.java.net/11/下载生产就绪的OpenJDK版本。 二进制文件采用tar或zip格式,因此只需将它们解压缩并设置环境变量即可使用java编译器和java命令。

二、Java11新特性一览

图1 Java11新特性一览

其中,标准HTTP Client升级特性最为重要,其次和开发者有关系的是使用单个命令运行Java文件、字符串方法增强、Lambda参数的局部变量语法、基于嵌套的访问控制和在文件中读取/写入字符串。

ZGC:可伸缩低延迟垃圾收集器是一个令人兴奋的特性,可惜地是现在处于实验性阶段。

1、标准HTTP Client升级

Java 11标准化了Http Client API。新Http Client API,提供了对HTTP/2等业界前沿标准的支持,同时也向下兼容HTTP/1.1,本身也支持WebSockets,精简友好的API接口,与主流开源API(如:Apache HttpClient、Jetty、OkHttp 等)类似甚至性能更高。

GET请求示例代码:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();

2、使用单个命令运行Java文件

该特性不需要首先使用javac工具编译java源文件。 您可以使用java命令直接运行该文件,并隐式编译。

例如:如果名为HelloWorld.java的文件包含一个名为hello.World的类,那么该命令:

$ java HelloWorld.java

等用于

$ javac HelloWorld.java
$ java -cp . hello.World

3、字符串方法增强

增加了isBlank() 、lines()、strip()、stripLeading()、stripTrailing()、repeat(int)等方法。

4、Lambda参数的局部变量语法

该特性允许var用于声明隐式类型的lambda表达式的形式参数,我们现在可以使用:

(var s1, var s2) -> s1 + s2

可以让您将注释应用于局部变量和Lambda表达式:

(@Nonnull var s1, @Nonnull var s2) -> s1 + s2

5、基于嵌套的访问控制

假设有如下一段代码:

public class Main {
public void myPublic() {
}
private void myPrivate() {
}
class Nested {
public void nestedPublic() {
myPrivate();
}
}
}

可以通过上述方式从上面的嵌套类访问主类的私有方法。

但是如果我们使用Java反射访问,它将给出IllegalStateException。

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

Java 11嵌套访问控制在反射中解决了这个问题。

java.lang.Class在反射API中引入了三个方法:getNestHost,getNestMembers和isNestmateOf。

6、在文件中读取/写入字符串

Java 11致力于使String的读写更方便。

它介绍了以下用于读写文件的方法:

readString()

writeString()

下面的代码展示了一个这样的例子:

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

7、ZGC:可伸缩低延迟垃圾收集器

Java 11引入了低延迟GC。 这是一个实验性功能。很高兴看到Oracle重视GC的重要性。

8、飞行记录器

之前曾经是Oracle JDK中的商业插件的Flight Recorder现在是开源的,因为Oracle JDK本身不再是免费的。

JFR是一种分析工具,用于从正在运行的Java应用程序中收集诊断和分析数据。

它的性能开销可以忽略不计,通常低于1%。 因此,它可以用于生产环境。

启用飞行记录器参数如下:

java -XX:StartFlightRecording=duration=1s, filename=recording.jfr

也可以使用 bin/jcmd 工具启动和配置飞行记录器:

$ jcmd <pid> JFR.start
$ jcmd <pid> JFR.dump filename=recording.jfr
$ jcmd <pid> JFR.stop

9、动态类文件常量

Java类文件格式现在扩展支持新的常量池形式CONSTANT_Dynamic。 此特性的目标是通过创建可以使用用户提供的行为进行参数化的单个新常量池形式,来降低开发新形式的可实现类文件约束的成本和中断,这提高了性能。

10、Epsilon:低开销垃圾回收器

引入名为Epsilon的垃圾收集器,该收集器不做任何垃圾回收,可用于性能测试、短生命周期的任务等,使用-XX:+UseEpsilonGC开启,该功能是一个实验性功能。

11、移除Java EE和CORBA模块

这些模块已在Java 9中弃用。现在它们被完全删除。

删除了以下包:java.xml.ws,java.xml.bind,java.activation,java.xml.ws.annotation,java.corba,java.transaction,java.se.ee,jdk.xml.ws,jdk.xml.bind。

12、ChaCha20和Poly1305密码算法

Java 11提供了ChaCha20和ChaCha20-Poly1305 Cipher实现。 这些算法将在SunJCE提供程序中实现。

13、改进Aarch64内在函数

改进现有的字符串和数组内在函数,并在AArch64处理器上为java.lang.Math的sin,cos和log函数实现新的内在函数。

14、弃用Nashorn JavaScript引擎

不推荐使用Nashorn JavaScript脚本引擎和API,从而表明它们将在后续版本中删除。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();