我们还没有完全沉浸在 Java 10 中,而 Java 11 就在这里。 Java 11 之所以重要,不仅仅是因为几个原因。 甲骨文已经改进了它的支持模型,并提出了一个发布系列,大约每 6 个月就会带来一次快速更新。
他们更改了许可和支持模型,这意味着如果您下载 Java 11 Oracle JDK,它将为商业用途付费。
这是否意味着我需要从现在开始为 Java 付费?
没有. 除非您下载 Oracle JDK 并在生产中使用它,否则不用。
注意: IntelliJ IDEA 2018.2.4 社区版已经支持 Java 11。
Java 11 是继 Java 8 之后的第二个 LTS 版本。自 Java 11 以来,Oracle JDK 将不再免费用于商业用途。
您可以在开发阶段使用它,但要在商业上使用它,您需要购买许可证。 如果您不这样做,您可以随时从 Oracle 获得传票!
Java 10 是最后一个可以下载的免费 Oracle JDK。
Oracle 从 2019 年 1 月起停止 Java 8 支持。您需要为更多支持付费。
您可以继续使用它,但不会获得任何补丁/安全更新。
从 Java 11 以后,Oracle 将不再为任何单一 Java 版本提供免费的长期支持 (LTS)。
虽然 Oracle JDK 不再免费,但您始终可以从 Oracle 或其他提供商(例如 AdoptOpenJDK、Azul、IBM、Red Hat 等)下载 Open JDK 构建。在我看来,除非您正在寻找有兴趣的企业级使用 支付支持费用,您可以使用 OpenJDK 并在必要时对其进行升级。
由于 Oracle 已经创建了一个发布系列,其中每六个月发布一个新版本,如果您使用 Oracle 提供的免费 Open JDK,您将需要每六个月更新一次,因为 Oracle 不会在发布后提供免费更新。 新版本发布。 这对于适应一家公司来说可能具有挑战性。
为 Oracle 的商业支持付费,只需从一个 LTS 版本迁移到下一个 LTS 版本。
这样,您将在 2026 年之前获得对 Java 11 的所有更新和支持。您可以在 2022 年下载 Java 17。
即使在其支持结束后仍继续使用免费的 Java 版本。 尽管您不会获得安全更新,但它可能会打开安全漏洞。
Oracle 不会为 Java 9 和 Java 10 提供商业支持或更新。您需要寻找其他替代版本才能继续免费使用它们。
了解了 Java 11 带来的包袱之后,现在让我们为开发人员分析 Java 11 中的重要特性。 我们还将讨论一些重要的 JEP。
注意: JavaFX 将作为一个单独的模块提供,与 Java JDK 的 6 个月发布周期时间表无关。
您可以从此 链接 下载生产就绪的 OpenJDK 版本。 二进制文件是 tar 或 zip 格式,因此只需解压缩它们并设置环境变量以使用 java 编译器和 java 命令。
Java 11 的一些重要特性包括:
让我们讨论一下 JEP 流程中 Java 11 引入的新特性。
一个主要的变化是你不需要先用 javac
工具编译 java 源文件。 您可以使用 java 命令直接运行该文件,它会隐式编译。
此功能属于 JEP 330。
以下是对 Java 11 中引入的 Java String 类的新方法的先睹为快:
isBlank() – 此实例方法返回一个布尔值。 空字符串和只有空格的字符串被视为空白。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
System.out.println(" ".isBlank()); //true
String s = "Anupam";
System.out.println(s.isBlank()); //false
String s1 = "";
System.out.println(s1.isBlank()); //true
}
}
lines()
此方法返回一个字符串流,它是按行拆分的所有子字符串的集合。
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws Exception {
String str = "JD\nJD\nJD";
System.out.println(str);
System.out.println(str.lines().collect(Collectors.toList()));
}
}
上述代码的输出是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVfI1HVl-1668333338985)(Java_11_Features.assets/method.jpg)]
strip(), stripLeading(), stripTrailing()
strip()
– 从字符串的开头和结尾删除空格。
但是我们已经有了 trim()。 那么strip()有什么用呢?
strip()
是trim()
的“Unicode 感知”演变。
当 trim()
被引入时,Unicode 并没有发展。 现在,新的 strip() 删除了所有类型的空格前导和尾随(检查方法 Character.isWhitespace(c)
以了解 unicode 是否为空格)
下面给出使用上述三种方法的示例:
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
String str = " JD ";
System.out.print("Start");
System.out.print(str.strip());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripLeading());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripTrailing());
System.out.println("End");
}
}
上述代码在控制台中的输出为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2VM44JQ3-1668333338986)(Java_11_Features.assets/method.jpg)]
repeat(int)
repeat 方法只是将字符串重复多次,如方法中所述,以 int 形式重复。
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
String str = "=".repeat(2);
System.out.println(str); //prints ==
}
}
JEP 323, Lambda 参数的局部变量语法是 Java 11 中唯一的语言功能版本。
在 Java 10 中,引入了【局部变量类型推断】(https://www.journaldev.com/19871/java-10-local-variable-type-inference)。 因此我们可以从 RHS 中推断出变量的类型 - var list = new ArrayList
JEP 323 允许使用 var
来声明隐式类型 lambda 表达式的形式参数。
我们现在可以定义:
(var s1, var s2) -> s1 + s2
这在 Java 8 中也是可能的,但在 Java 10 中被删除了。现在它又回到了 Java 11 中以保持统一。
但是,当我们可以跳过 lambda 中的类型时,为什么需要这样做呢?
如果您需要像 @Nullable 一样应用注解,则在不定义类型的情况下无法做到这一点。
此功能的限制 - 您必须在所有参数上指定类型 var 或不指定。
以下情况是不允许的:
(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed
var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.
在 Java 11 之前,这是可能的:
public class Main {
public void myPublic() {
}
private void myPrivate() {
}
class Nested {
public void nestedPublic() {
myPrivate();
}
}
}
主类的私有方法可以通过上述方式从上面的嵌套类中访问。
但是如果我们使用Java Reflection,它会给出一个IllegalStateException
。
Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);
Java 11 嵌套访问控制通过反射解决了这个问题。
java.lang.Class
在反射 API 中引入了三种方法:getNestHost()
、getNestMembers()
和 isNestmateOf()
。
Java类文件格式现在扩展支持一种新的常量池形式CONSTANT_Dynamic。这个JEP的目标是通过创建一个新的常量池表单(可以用用户提供的行为参数化)来减少开发可具体化的类文件约束新形式的成本和干扰。
这提高了性能
与负责分配内存和释放内存的 JVM GC 不同,Epsilon 只分配内存。
它为以下事情分配内存:
现在 Elipson 仅适用于测试环境。 它将导致生产中的 OutOfMemoryError 并使应用程序崩溃。
Elipson 的好处是没有内存清除开销。 因此它会给出一个准确的性能测试结果,我们不能再用 GC 来停止它。
注意: 这是一个实验性功能。
这些模块在 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
Flight Recorder 以前是 Oracle JDK 中的商业插件,现在是开源的,因为 Oracle JDK 本身不再免费。
JFR 是一种分析工具,用于从正在运行的 Java 应用程序中收集诊断和分析数据。
它的性能开销可以忽略不计,通常低于 1%。 因此它可以用于生产应用程序。
Java 11 标准化了 Http 客户端 API。
新的 API 支持 HTTP/1.1 和 HTTP/2。 它旨在提高客户端发送请求和接收服务器响应的整体性能。 它还原生支持 WebSockets。
Java 11 力求让 String 的读写变得方便。
它引入了以下读取和写入文件的方法:
下面的代码展示了一个这样的例子
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
Java 11 提供了 ChaCha20 和 ChaCha20-Poly1305 密码实现。 这些算法将在 SunJCE 提供程序中实现。
改进现有的字符串和数组内在函数,并在 AArch64 处理器上为 java.lang.Math sin、cos 和 log 函数实现新的内在函数。
Java 11 引入了低延迟 GC。 这是一个实验性功能。
It’s good to see that Oracle is giving importance to GC’s.
Nashorn JavaScript 脚本引擎和 API 已弃用,因此表明它们将在后续版本中删除。
我们已经了解了 Java 11 中提供的重要功能和更新。Java 12 发布时再见。
<<<<<<<<<<<< [完] >>>>>>>>>>>>