Java 11 新特性
原文:https://www.studytonight.com/java-examples/java-11-new-features
Java 11 于 2018 年 9 月在推出,也就是 Java 10 发布 6 个月后。Java 10 是最后一个无需许可即可用于商业目的的 Java 版本。
Java 11 不是免费的,我们需要付费才能用于商业目的。Oracle 仍然提供可以免费使用的 OpenJDK 版本。
在本教程中,我们将学习 Java 11 中引入的新特性。
运行 Java 文件
要运行一个 Java 文件,我们首先使用 javac 命令编译它。但是使用 Java 11,我们可以通过使用单个 Java 命令直接运行一个 Java 文件。
javac MyFirstJavaProgram.java
java MyFirstJavaProgram
我们不再需要使用上述过程。相反,我们可以使用以下命令,它将给出相同的结果。阅读我们关于的详细文章。
java MyFirstJavaProgram.java
新字符串方法
Java 11 为字符串类引入了一些新方法。下面的列表解释了这些新方法。
isBlank() -该方法用于检查字符串是否为空。空字符串和只有空白的字符串被视为空白。
public class Demo
{
public static void main(String[] args)
{
String s1 = "";
String s2 = " ";
String s3 = "String";
System.out.println("s1 is blank: " + s1.isBlank());
System.out.println("s2 is blank: " + s2.isBlank());
System.out.print("s3 is blank: " + s3.isBlank());
}
}
s1 为空:真 s2 为空:真 s3 为空:假
line()-该方法使用行终止符拆分字符串并返回一个流。
import java.util.List;
import java.util.stream.Collectors;
public class Demo
{
public static void main(String[] args)
{
String s = "This\n is\n a\n String";
List<String> listOfLines = s.lines().collect(Collectors.toList());
System.out.print(listOfLines);
}
}
【这,是,a,字符串】
repeat() - 此方法用于复制或重复字符串。
public class Demo
{
public static void main(String[] args)
{
String s = "String";
System.out.println("String: " + s);
System.out.println("String repeated twice: " + s.repeat(2));
System.out.print("String repeated five times: " + s.repeat(5));
}
}
弦:弦 弦重复两次:弦响 弦重复五次:弦响弦响弦响
strip()、stripLeading()、strip training()-这些方法用于移除字符串中的空白。它们与现有的 trim()方法非常相似,但提供了 Unicode 支持。
public class Demo
{
public static void main(String[] args)
{
String s = " string ";
System.out.println("$" + s + "$");
System.out.println("$" + s.strip() + "$");
System.out.println("$" + s.stripLeading() + "$");
System.out.println("$" + s.stripTrailing() + "$");
}
}
$ string $ $ string $ $ string $ $ string $
基于嵌套的访问控制
以前的 Java 版本允许私有成员访问嵌套类(嵌套类),但是我们不能将它们与反射 API 一起使用。Java 11 不再使用桥方法,而是为反射 API 提供了 getNestHost()、getnestmotof()和 isNestmatOf()方法。
public class Demo {
private void privateMethod() {
System.out.print("Private Method");
}
class NestedClass {
public void callPrivateMethod() {
privateMethod();
}
}
public static void main(String[] args) {
System.out.println(Demo.class.isNestmateOf(Demo.NestedClass.class)); //Demo class is nestmate of NestedClass
System.out.println(Demo.NestedClass.class.isNestmateOf(Demo.class)); //NestedClass is nestmate of Demo class
System.out.println(Demo.NestedClass.class.getNestHost()); //Nest host of NestedClass
System.out.println(Demo.class.getNestMembers()); //Nest host of Demo class
}
}
真 真 班 Demo 【ljava . lang . class;@36baf30c
新文件方法
Java 11 使得读取和写入字符串变得更加容易。为此,在File
类中添加了 readString()和 writeString()静态方法。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class Demo
{
public static void main(String[] args) throws IOException
{
Path path = Files.createTempFile("temporaryFile", ".txt");
//Writing to the file
Files.writeString(path, "Hello World");
//Reading from the file
String s = Files.readString(path);
System.out.print(s);
}
}
你好世界
集合转换为数组
新的默认 toArray()方法用于轻松地将集合转换为正确类型的数组。
import java.util.ArrayList;
import java.util.Arrays;
public class Demo
{
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(10);
list.add(15);
Integer[] intArr = list.toArray(Integer[]::new);
System.out.print(Arrays.toString(intArr));
}
}
【5,10,15】
not()方法
Java 11 中的谓词接口增加了一个静态 not()方法。顾名思义,这种方法用于否定谓词。not()方法也可以与方法引用一起使用。
让我们使用这个方法来创建两个执行相反任务的谓词。
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Demo
{
public static void main(String[] args) {
Predicate<String> startWithZ = s -> s.charAt(0) == 'z';
Predicate<String> doesNotStartWithZ = Predicate.not(startWithZ);
List<String> list = Arrays.asList("za", "zq", "az", "aq", "zz");
List<String> strsStartingWithZ = list.stream()
.filter(startWithZ)
.collect(Collectors.toList());
List<String> strsNotStartingWithZ = list.stream()
.filter(doesNotStartWithZ)
.collect(Collectors.toList());
System.out.println(strsStartingWithZ);
System.out.println(strsNotStartingWithZ);
}
}
【za,zq,ZZ】 【az,aq】
HTTP 客户端
HTTP 客户端 API 最初是在 Java 9 中引入的,并在 Java 10 中进行了更新。它是作为 Java 11 版本的标准功能提供的。新的 API 性能更好,兼容 HTTP/1.1 和 HTTP/2。该 API 还提供对网络套接字的支持。
λ的局部变量语法
Java 11 增加了对 lambda 表达式的局部变量语法的支持。Lambdas 可以推断类型,但是使用 var 关键字允许我们在参数中使用像@NotNull 或@Nullable 这样的注释。
(@NotNull var str) -> "$" + str
动态类文件常数
在 Java 11 中,Java 类文件格式支持一种新的常量池形式,称为常量 _ 动态。这将把创建委托给引导方法。这是为了通过创建一个新的常量池表单来降低创建新的可具体化类文件常量的成本,该表单将通过适当的用户定义行为进行参数化。这一特性大大提高了性能。
改进的 Aarch64 内部电路
内部函数是由编译器以某种特殊方式处理的函数。它们利用特定于 CPU 架构的汇编代码来提高性能。
Java 11 改进和优化了 AArch64(或 ARM64)处理器上现有的字符串和数组内部特性。Java 11 还为 java.lang.Math 的 sin、cos 和 log 方法添加了新的内部函数。
ε垃圾收集器
Java 11 引入了一个名为 Epsilon 的无操作(No-Op)垃圾收集器。这是一个实验特征。它被称为无操作垃圾收集器,因为它将分配内存,但永远不会收集任何垃圾。我们可以用它来模拟内存不足的错误。以下是它的一些用例。
- 性能试验
- 记忆压力测试
- 虚拟机接口测试和
- 极其短暂的工作
- 最后一滴延迟和吞吐量改进
使用以下命令启用ε气相色谱。
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
Java 飞行记录器
Java 飞行记录器(简称 JFR)用于为应用收集分析数据。它过去只能用于商业用途,但现在在 OpenJDK 11 下是开源的。我们可以将它用于生产应用,因为它的开销很小(低于 1%)。它将数据记录在 JFR 文件中,我们可以使用 JDK 任务控制工具来分析收集到的信息。使用以下命令开始 180 秒的 JFR 录音,并将数据存储在 demo.jfr 文件中。
-XX:StartFlightRecording=duration=180s,settings=profile,filename=demo.jfr
弃用的 Java EE 和 CORBA 模块
Java EE 和 COBRA 的一些模块在 Java 9 中被弃用。它们现在已经完全从 Java 11 中移除了。以下包和工具不再是 Java 11 的一部分。但是,它们仍然可以在第三方网站上使用。
- java.xml.ws
- java.xml.bind
- java.activation
- java.xml.ws.annotation
- java.corba
- java .事务
- java.se.ee
- wsgen 和 wsimport
- schemagen 和 xjc
- idlj、orbd、servertool 和 tnamesrv
删除了 JMC 和贾法克斯
JDK 将不再包括 JDK 任务控制(JMC)和 JavaFX 模块。它们可以单独下载。
弃用的模块
在 Java 11 中不推荐使用纳斯霍恩 JavaScript 引擎和 JJS。未来的版本可能会完全删除它们。
也不推荐使用 pack200 和 unpack200 工具以及 java.util.jar 的 pack200 压缩方案 API。
其他变化
- 不安全的 RC4 流密码被 ChaCha20 和 ChaCha20-Poly1305 密码实现所取代。
- 椭圆曲线差分-赫尔曼(ECDH)方案被曲线 25519 和曲线 448 密钥协商方案所取代。
- 传输层安全性(TLS)升级到 1.3 版,以提高安全性和性能。
- 介绍了一种低延迟、可扩展的垃圾收集器——Z 垃圾收集器(ZGC)。这是一个实验特征。
- Unicode 10 带来了新的代码点、字符、符号和表情符号。
摘要
Java 11 引入了很多新的变化和特性。一些现有功能已被弃用或完全删除。在本教程中,我们了解了 Java 11 中引入的变化。