Java 11 – 特性和比较
每 6 个月,Oracle 发布新的Java版本。 9 月的Java 11 版本甚至在发布之前就已经在计算机科学界引起了轰动,因为它宣布从现在开始, Java将为商业用途付费。以下文章将展示有关 JDK 11 的重要功能、增强功能和已弃用的功能。
重要变更和信息
- 运行小程序和 Web 应用程序所需的部署堆栈已从 JDK 中删除,这在 JDK 9 中已弃用。
- 由于部署堆栈不可用,已从支持的配置列表中删除了整个受支持的浏览器部分。
- 自动更新已从 Windows 和 macOS 中的 JRE 安装中删除。
- JavaFX 和Java Mission Control 现在可以单独下载。
- 不再提供法语、德语、意大利语、韩语、葡萄牙语(巴西)、西班牙语和瑞典语的Java语言翻译。
- 在此版本中,不再提供 JRE 或服务器 JRE。仅提供 JDK。
- 更新的 Windows 打包格式已从 tar.gz 更改为 .zip
- macOS 的更新包格式已从 .app 更改为 .dmg
1. 新的字符串方法:
isBlank():这是一个布尔方法。它只在字符串为空时返回 true,反之亦然。
Java
// Java Program to demonstrate
// the working of isBlank() method
class GFG {
public static void main(String args[])
{
String str1 = "";
System.out.println(str1.isBlank());
String str2 = "GeeksForGeeks";
System.out.println(str2.isBlank());
}
}
Java
// Java Program to demonstrate
// the working of lines() method
import java.util.*;
class GFG {
public static void main(String args[])
{
String str = "Geeks\nFor\nGeeks";
System.out.println(
str.lines().collect(Collectors.toList()));
}
}
Java
// Java Program to demonstrate
// the working of repeat() method
class GFG {
public static void main(String args[])
{
String str = "GeeksForGeeks";
System.out.println(str.repeat(4));
}
}
Java
// Java Program to demonstrate
// the working of stripLeading() method
class GFG {
public static void main(String args[])
{
String str = " GeeksForGeeks";
System.out.println(str.stripLeading());
}
}
Java
// Java Program to demonstrate
// the working of stripTrailing() method
class GFG {
public static void main(String args[])
{
String str = "GeeksForGeeks ";
System.out.println(str.stripTrailing());
}
}
Java
// Java Program to demonstrate
// the working of strip() method
class GFG {
public static void main(String args[])
{
String str = " GeeksForGeeks ";
System.out.println(str.strip());
}
}
Java
// Java program to show the Variable
// used in the lambda expression
public class VarInLambdaExample {
public static void main(String[] args)
{
IntStream.of(1, 2, 3, 5, 6, 7)
.filter((var i) -> i % 2 == 0)
.forEach(System.out::println);
}
}
Java
// Variable without using lambda expression
public class WithoutVarInLambdaExample {
public static void main(String[] args)
{
IntStream.of(1, 2, 3, 5, 6, 7)
.filter(i -> i % 2 == 0)
.forEach(System.out::println);
}
}
true
false
lines():这个方法是返回一个由行终止符分割的字符串集合。
Java
// Java Program to demonstrate
// the working of lines() method
import java.util.*;
class GFG {
public static void main(String args[])
{
String str = "Geeks\nFor\nGeeks";
System.out.println(
str.lines().collect(Collectors.toList()));
}
}
输出
Geeks
For
Geeks
repeat(n):结果是原始字符串在参数中重复次数的连接字符串。
Java
// Java Program to demonstrate
// the working of repeat() method
class GFG {
public static void main(String args[])
{
String str = "GeeksForGeeks";
System.out.println(str.repeat(4));
}
}
GeeksForGeeksGeeksForGeeksGeeksForGeeksGeeksForGeeks
stripLeading():用于去除字符串前面的空白
Java
// Java Program to demonstrate
// the working of stripLeading() method
class GFG {
public static void main(String args[])
{
String str = " GeeksForGeeks";
System.out.println(str.stripLeading());
}
}
GeeksForGeeks
stripTrailing():用于去除字符串后面的空白
Java
// Java Program to demonstrate
// the working of stripTrailing() method
class GFG {
public static void main(String args[])
{
String str = "GeeksForGeeks ";
System.out.println(str.stripTrailing());
}
}
GeeksForGeeks
strip():用于去除字符串前后的空格
Java
// Java Program to demonstrate
// the working of strip() method
class GFG {
public static void main(String args[])
{
String str = " GeeksForGeeks ";
System.out.println(str.strip());
}
}
GeeksForGeeks
2.新的文件方法
writeString():这是在文件中写入一些内容。
jshell>Files.writeString(Path.of(example.txt), "GeeksForGeeks!");
readString():这用于读取文件的内容。
jshell>Files.readString(Path.of(example.txt));
Output: "GeeksForGeeks!"
isSameFile():该方法用于知道两个路径是否定位到同一个文件。
jshell>Files.isSameFile(Path.of("example1.txt"), Path.of("example1.txt"));
Output: true
jshell>Files.isSameFile(Path.of("example2.txt"), Path.of("example1.txt"));
Output: false
3. 模式识别方法
asMatchPredicate():此方法类似于Java 8 方法 asPredicate()。在 JDK 11 中引入,如果模式与输入字符串匹配,此方法将创建一个谓词。
jshell>var str = Pattern.compile("aba").asMatchPredicate();
jshell>str.test(aabb);
Output: false
jshell>str.test(aba);
Output: true
4. Epsilon 垃圾收集器
这处理内存分配,但没有实际的内存回收机制。一旦可用的Java堆用完,JVM 就会关闭。
它的目标是:-
- 性能测试
- 内存压力测试
- 最后一滴延迟改进
5. 删除了Java EE 和 CORBA 模块
这些模块在Java 9 中已被弃用,并声明在进一步的 JDK 版本中删除这些模块。
6.线程函数的去除
stop(Throwable obj) 和 destroy() 对象已从 JDK 11 中删除,因为它们仅分别抛出 UnSupportedOperation 和 NoSuchMethodError。除此之外,它们毫无用处。
7.时间单位换算
此方法用于将给定时间转换为单位,如 DAY、MONTH、YEAR 以及时间。
jshell>TimeUnit c = TimeUnit.DAYS;
Output: DAYS
jshell>c.convert(Duration.ofHours(24));
Output: 1
jshell>c.convert(Duration.ofHours(50));
Output: 2
Optional.isEmpty():如果任何对象的值为 null,则此方法返回 true,否则返回 false。
jshell>Optional str = Optional.empty();
jshell>str.isEmpty();
Output: true
jshell>Optional str = Optional.of("TonyStark");
jshell>str.isEmpty();
Output: false
8. Lambda 参数的局部变量语法
JDK 11 允许在 lambda 表达式中使用“var”。这是为了与Java 10 的本地 'var' 语法一致而引入的。
Java
// Java program to show the Variable
// used in the lambda expression
public class VarInLambdaExample {
public static void main(String[] args)
{
IntStream.of(1, 2, 3, 5, 6, 7)
.filter((var i) -> i % 2 == 0)
.forEach(System.out::println);
}
}
输出:
2
6
Java
// Variable without using lambda expression
public class WithoutVarInLambdaExample {
public static void main(String[] args)
{
IntStream.of(1, 2, 3, 5, 6, 7)
.filter(i -> i % 2 == 0)
.forEach(System.out::println);
}
}
输出:
2
6
删除的功能和选项
- 删除 com.sun.awt.AWTUtilities 类
- 从 Oracle JDK 中删除 Lucida 字体
- 删除 appletviewer Launcher
- Oracle JDK 的 javax.imageio JPEG 插件不再支持带 alpha 的图像
- 删除 sun.misc.Unsafe.defineClass
- 删除 Thread.destroy() 和 Thread.stop(Throwable) 方法
- 删除 sun.nio.ch.disableSystemWideOverlappingFileLockCheck 属性
- 删除 sun.locale.formatasdefault 属性
- 移除 JVM-MANAGEMENT-MIB.mib
- 删除 SNMP 代理
- 删除Java部署技术
- 从 Oracle JDK 中删除 JMC
- 从 Oracle JDK 中删除 JavaFX
- JEP 320 删除Java EE 和 CORBA 模块
已弃用的功能和选项
- ThreadPoolExecutor 不应该指定对终结的依赖
- JEP 335 弃用 Nashorn JavaScript 引擎
- 弃用 -XX+AggressiveOpts
- 对商业功能的过时支持
- 弃用基于流的 GSSContext 方法
- JEP 336 弃用 Pack200 工具和 API