📜  Java 11 – 特性和比较

📅  最后修改于: 2022-05-13 01:54:51.209000             🧑  作者: Mango

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

删除的功能和选项

  1. 删除 com.sun.awt.AWTUtilities 类
  2. 从 Oracle JDK 中删除 Lucida 字体
  3. 删除 appletviewer Launcher
  4. Oracle JDK 的 javax.imageio JPEG 插件不再支持带 alpha 的图像
  5. 删除 sun.misc.Unsafe.defineClass
  6. 删除 Thread.destroy() 和 Thread.stop(Throwable) 方法
  7. 删除 sun.nio.ch.disableSystemWideOverlappingFileLockCheck 属性
  8. 删除 sun.locale.formatasdefault 属性
  9. 移除 JVM-MANAGEMENT-MIB.mib
  10. 删除 SNMP 代理
  11. 删除Java部署技术
  12. 从 Oracle JDK 中删除 JMC
  13. 从 Oracle JDK 中删除 JavaFX
  14. JEP 320 删除Java EE 和 CORBA 模块

已弃用的功能和选项

  1. ThreadPoolExecutor 不应该指定对终结的依赖
  2. JEP 335 弃用 Nashorn JavaScript 引擎
  3. 弃用 -XX+AggressiveOpts
  4. 对商业功能的过时支持
  5. 弃用基于流的 GSSContext 方法
  6. JEP 336 弃用 Pack200 工具和 API