我们还没有完全沉浸在Java 10中,Java 11在这里。Java 11不仅仅是因为几个原因而重要。Oracle已经更新了其支持模型,并提出了一个发布列车,将每6个月带来快速更新。
这意味着我现在需要为Java付钱吗? **NO.**不一定是除非你下载Oracle JDK并在生产中使用它。
注: IntelliJ IDEA 2018.2.4 社区版已支持 Java 11。
为什么Java 11很重要?
Java 11 是 Java 8 之后的第二个 LTS 版本。 由于 Java 11, Oracle JDK 将不再免费用于商业使用,您可以在开发阶段使用它,但要在商业上使用它,您需要购买许可证。 如果您没有,您可以从 Oracle 获得任何一天的发票账单! Java 10是最后一个可以下载的免费 Oracle JDK。 Oracle 将从 2019 年 1 月停止支持 Java 8。
Oracle 将不再为任何单一的 Java 版本提供免费的长期支持(LTS)。
虽然 Oracle JDK 不再是免费的,但您可以从 Oracle 或其他提供商(如 AdoptOpenJDK、Azul、IBM、Red Hat 等)下载 Open JDK 构建,在我看来,除非您正在寻找企业级的使用,并且渴望支付支持费,否则您可以使用 OpenJDK并根据需要升级它们。
2.我应该下载哪个 JDK 构建,每个构建都有哪些好处?
由于Oracle已经创建了一个发布列车,其中每六个月都会出现一个新版本,如果您正在使用Oracle的免费开放JDK,您将需要每六个月更新一次,因为Oracle不会在新版本发布后提供免费更新。这可能对公司来说是很困难的适应性。 支付对Oracle的商业支持,并只从一个LTS版本迁移到下一个LTS版本。 这样,您将获得Java 11的所有更新和支持,直到2026年。
Oracle 不会为 Java 9 和 Java 10 提供商业支持或更新。
了解了Java 11所带来的行李,现在可以分析Java 11对开发人员的重要功能,我们也将讨论一些重要的JEP。
如何下载Java 11免费版?
您可以从此下载生产准备的OpenJDK版本(链接)。二进制是tar或zip格式,所以只需解开它们并设置环境变量以使用java编译器和java命令。
Java 11 功能
Java 11 的一些重要功能包括:
- 使用单个命令 运行Java文件
- String class中的新实用方法 *Local-Variable Syntax for Lambda Parameters
- Nested Based Access Control
- JEP 321: HTTP Client
- 读/写到和从文件
- JEP 328: Flight Recorder
让我们来讨论从JEP进程中引入的Java 11的新功能。
1、使用单个命令运行Java文件
一个主要的变化是,你不需要先使用javac
工具编译 Java 源文件,你可以直接使用 java 命令运行该文件,并且它默认地编译。
(二) Java String 方法
isBlank() - 此实例方法返回布尔值. 只有白空的空串和空串被视为空串。
1import java.util.*;
2
3public class Main {
4 public static void main(String[] args) throws Exception {
5 // Your code here!
6
7 System.out.println(" ".isBlank()); //true
8
9 String s = "Anupam";
10 System.out.println(s.isBlank()); //false
11 String s1 = "";
12 System.out.println(s1.isBlank()); //true
13 }
14}
**lines() 此方法返回一个字符串的流,即所有字符串的集合。
1import java.util.stream.Collectors;
2
3public class Main {
4 public static void main(String[] args) throws Exception {
5
6 String str = "JD\nJD\nJD";
7 System.out.println(str);
8 System.out.println(str.lines().collect(Collectors.toList()));
9 }
10}
The output of the above code is: strip(), stripLeading(), stripTrailing()
strip()
- Removes the white space from both, beginning and the end of string.
但我们已经有剪辑()。 那么 strip()的需要是什么? strip()
是 trim()
的Unicode-aware
演变。 当 trim()
被引入时,Unicode 没有演变。 现在,新的 strip() 删除所有类型的带领和追踪的白空间(检查方法 Character.isWhitespace(c)
来知道一个 unicode 是否是白空间)
使用上述三种方法的例子如下所示:
1public class Main {
2 public static void main(String[] args) throws Exception {
3 // Your code here!
4
5 String str = " JD ";
6 System.out.print("Start");
7 System.out.print(str.strip());
8 System.out.println("End");
9
10 System.out.print("Start");
11 System.out.print(str.stripLeading());
12 System.out.println("End");
13
14 System.out.print("Start");
15 System.out.print(str.stripTrailing());
16 System.out.println("End");
17 }
18}
The output in the console from the above code is: repeat(int) The repeat method simply repeats the string that many numbers of times as mentioned in the method in the form of an int.
1public class Main {
2 public static void main(String[] args) throws Exception {
3 // Your code here!
4
5 String str = "=".repeat(2);
6 System.out.println(str); //prints ==
7 }
8}
4.3)Local-Variable 对 Lambda 参数的语法
JEP 323,Local-Variable Syntax for Lambda Parameters是Java 11中唯一的语言特性发布版本。在Java 10中,Local Variable Type Inference(/community/tutorials/java-10-local-variable-type-inference)被引入。因此,我们可以从RHS中推断变量类型 - var list = new ArrayList<String>();
JEP 323允许使用 var
来声明暗示键入的 lambda表达式的正式参数。
1(var s1, var s2) -> s1 + s2
这在Java 8中也是可能的,但在Java 10中被删除了,现在它已经回到Java 11中,以保持事物的均匀性。 但是为什么我们可以在Lambda中跳过类型时需要这样做? 如果你需要像 @Nullable一样应用注释,你不能没有定义类型而这样做。
1(var s1, s2) -> s1 + s2 //no skipping allowed
2(var s1, String y) -> s1 + y //no mixing allowed
3
4var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.
4.4 基于巢的访问控制
在 Java 11 之前,这是可能的:
1public class Main {
2
3 public void myPublic() {
4 }
5
6 private void myPrivate() {
7 }
8
9 class Nested {
10
11 public void nestedPublic() {
12 myPrivate();
13 }
14 }
15}
主类的私人方法可以通过上述方式从上面的类中访问,但如果我们使用Java反射(/community/tutorials/java-reflection-example-tutorial),它会给出一个IllegalStateException
。
1Method method = ob.getClass().getDeclaredMethod("myPrivate");
2method.invoke(ob);
Java 11 嵌入式访问控制在反思中解决了这一问题,java.lang.Class
在反射 API 中引入了三个方法:getNestHost()
,getNestMembers()
和isNestmateOf()
。
JEP 309:动态类文件常数
Java 类文件格式现在扩展了支持一个新的常态集群格式,CONSTANT_Dynamic。这个 JEP 的目标是通过创建一个单一的新常态集群格式来降低开发新形式的可实现的类文件限制的成本和干扰,可以通过用户提供的行为进行参数化。
JEP 318:Epsilon:一个非操作垃圾收集器
与负责分配和释放内存的 JVM GC 不同,Epsilon 只分配内存。
- 性能测试
- 记忆压力测试
- VM 界面测试
- 非常短的活跃工作
- 最后降落延迟的改进
- 最后降落输出的改进
现在Elipson仅适用于测试环境,这将导致 OutOfMemoryError在生产和应用程序的崩溃。Elipson的优势是没有内存清除。
JEP 320:删除 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。
JEP 328:飞行记录仪
Flight Recorder 以前曾是 Oracle JDK 的商业补充器,现在是开源的,因为 Oracle JDK 本身不再是免费的 JFR 是一个用于从运行 Java 应用程序中收集诊断和配置数据的配置工具。
JEP 321: HTTP 客户端
Java 11 标准化了 Http CLient API. 新 API 支持 HTTP/1.1 和 HTTP/2. 它旨在提高客户端发送请求和接收服务器响应的整体性能。
4.10) 阅读 / 写到和从文件的字符串
Java 11 致力于使 String 的阅读和写作变得方便,它引入了以下方法来读取和写入文件:
- 阅读()
- 写()
下面的代码显示了一个例子。
1Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
2System.out.println(path);
3String s = Files.readString(path);
4System.out.println(s); //This was posted on JD
JEP 329: ChaCha20 和 Poly1305 加密算法
Java 11 提供 ChaCha20 和 ChaCha20-Poly1305 加密实现,这些算法将在 SunJCE 提供商中实现。
JEP 315:改进Aarch64内涵
改进现有的字符串和数组内涵,并在 AArch64 处理器上实现 java.lang.Math 错误、 cos 和日志函数的新内涵。
JEP 333:ZGC:一个可扩展的低延迟垃圾收集器(实验)
Java 11 引入了低延迟 GC. 这是一个实验性的功能,很高兴看到 Oracle 正在重视 GC。
JEP 335:消除Nashorn的JavaScript引擎
Nashorn JavaScript 脚本引擎和 API 被贬值,这表明它们将在后续版本中被删除。
5、结论
我们已经通过了Java 11提供的重要功能和更新。