一、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