Java 11 的特性详解

这篇具有很好参考价值的文章主要介绍了Java 11 的特性详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们还没有完全沉浸在 Java 10 中,而 Java 11 就在这里。 Java 11 之所以重要,不仅仅是因为几个原因。 甲骨文已经改进了它的支持模型,并提出了一个发布系列,大约每 6 个月就会带来一次快速更新。

他们更改了许可和支持模型,这意味着如果您下载 Java 11 Oracle JDK,它将为商业用途付费。

这是否意味着我需要从现在开始为 Java 付费?

没有. 除非您下载 Oracle JDK 并在生产中使用它,否则不用。

🏷注意: IntelliJ IDEA 2018.2.4 社区版已经支持 Java 11。

1. 为什么 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 并在必要时对其进行升级。

2. 我应该下载哪个 JDK 版本以及它们各自的好处是什么?

由于 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 个月发布周期时间表无关。

3. 如何下载 Java 11 免费版?

您可以从此 链接 下载生产就绪的 OpenJDK 版本。 二进制文件是 tar 或 zip 格式,因此只需解压缩它们并设置环境变量以使用 java 编译器和 java 命令。

4. Java 11 的特性

Java 11 的一些重要特性包括:

  • 使用单个命令运行 Java 文件
  • String 类中的新实用方法
  • Lambda 参数的局部变量语法
  • 基于嵌套的访问控制
  • JEP 321: HTTP 客户端
  • 从文件中读取/写入字符串
  • JEP 328: 飞行记录仪

让我们讨论一下 JEP 流程中 Java 11 引入的新特性。

4.1) 使用单个命令运行 Java 文件

一个主要的变化是你不需要先用 javac 工具编译 java 源文件。 您可以使用 java 命令直接运行该文件,它会隐式编译。
此功能属于 JEP 330。

以下是对 Java 11 中引入的 Java String 类的新方法的先睹为快:

4.2) Java 字符串方法

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 ==
    }
}

4.3) Lambda 参数的局部变量语法

JEP 323, Lambda 参数的局部变量语法是 Java 11 中唯一的语言功能版本。
在 Java 10 中,引入了【局部变量类型推断】(https://www.journaldev.com/19871/java-10-local-variable-type-inference)。 因此我们可以从 RHS 中推断出变量的类型 - var list = new ArrayList<String>();

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.

4.4) 基于嵌套的访问控制

在 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()

4.5) JEP 309: 动态类文件常量

Java类文件格式现在扩展支持一种新的常量池形式CONSTANT_Dynamic。这个JEP的目标是通过创建一个新的常量池表单(可以用用户提供的行为参数化)来减少开发可具体化的类文件约束新形式的成本和干扰。
这提高了性能

4.6) JEP 318: Epsilon:一个无操作的垃圾收集器

与负责分配内存和释放内存的 JVM GC 不同,Epsilon 只分配内存。
它为以下事情分配内存:

  • 性能测试。
  • 内存压力测试。
  • 虚拟机接口测试。
  • 寿命极短的工作。
  • 最后一次下降延迟改进。
  • 最后一次吞吐量改进。

现在 Elipson 仅适用于测试环境。 它将导致生产中的 OutOfMemoryError 并使应用程序崩溃。

Elipson 的好处是没有内存清除开销。 因此它会给出一个准确的性能测试结果,我们不能再用 GC 来停止它。

📝注意: 这是一个实验性功能。

4.7) 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

4.8) JEP 328: 飞行记录仪

Flight Recorder 以前是 Oracle JDK 中的商业插件,现在是开源的,因为 Oracle JDK 本身不再免费。

JFR 是一种分析工具,用于从正在运行的 Java 应用程序中收集诊断和分析数据。
它的性能开销可以忽略不计,通常低于 1%。 因此它可以用于生产应用程序。

4.9) JEP 321: HTTP 客户端

Java 11 标准化了 Http 客户端 API。
新的 API 支持 HTTP/1.1 和 HTTP/2。 它旨在提高客户端发送请求和接收服务器响应的整体性能。 它还原生支持 WebSockets。

4.10) 从文件读取/写入字符串

Java 11 力求让 String 的读写变得方便。
它引入了以下读取和写入文件的方法:

  • readString()
  • writeString()

下面的代码展示了一个这样的例子

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

4.11) JEP 329: ChaCha20 和 Poly1305 加密算法

Java 11 提供了 ChaCha20 和 ChaCha20-Poly1305 密码实现。 这些算法将在 SunJCE 提供程序中实现。

4.12) JEP 315: 改进 Aarch64 内部函数

改进现有的字符串和数组内在函数,并在 AArch64 处理器上为 java.lang.Math sin、cos 和 log 函数实现新的内在函数。

4.13) JEP 333: ZGC:可扩展的低延迟垃圾收集器(实验性)

Java 11 引入了低延迟 GC。 这是一个实验性功能。
It’s good to see that Oracle is giving importance to GC’s.

4.14) JEP 335: 弃用 Nashorn JavaScript 引擎

Nashorn JavaScript 脚本引擎和 API 已弃用,因此表明它们将在后续版本中删除。

5. 结论

我们已经了解了 Java 11 中提供的重要功能和更新。Java 12 发布时再见。


<<<<<<<<<<<< [完] >>>>>>>>>>>>文章来源地址https://www.toymoban.com/news/detail-450281.html

到了这里,关于Java 11 的特性详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 8 新特性】Java CompletableFuture supplyAsync()详解

    supplyAsync()是 Java 8 引入的 CompletableFuture 静态方法。 supplyAsync() 默认完成在 ForkJoinPool.commonPool() 或指定 Executor 中异步执行的任务。 方法声明:supplyAsync(Supplier supplier) 需要将Supplier作为任务传递给 supplyAsync() 方法。 默认情况下,此任务将在 ForkJoinPool.commonPool() 中异步完成执行,

    2024年02月22日
    浏览(51)
  • Java8新特性:Optional类(超详解)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 到目前为止,臭名昭著的 空指针异常 是导致Java应用程序失败的最常见原因。以前,为了解决空指

    2023年04月09日
    浏览(42)
  • 拥抱变化,面向Java17,Java8-18全系列特性详解

    文章目录: Java 8 新特性 Java 9 新特性 Java 10 新特性 Java 11 新特性 Java 12 新特性 Java 13 新特性 Java 14 新特性 Java 15 新特性 Java 16 新特性 Java 17 新特性 Java 18 新特性 💡 文章较长,建议点赞、收藏、评论后慢慢看,合理利用 “ 只看目录功能 ” 当我们大部分Javaer还沉浸在Java 8 的

    2024年01月16日
    浏览(38)
  • 【C++】C++11特性

    1.1 {}初始化 C++11引入了初始化列表(Initializer lists)的特性,通过花括号 {} 可以方便地初始化数组、容器和自定义类型的成员变量。这种语法可以一次性地指定多个初始值,而不需要显式地编写多个赋值语句。 下面是一些示例用法: 初始化数组: 初始化容器(如std::vector)

    2024年02月16日
    浏览(35)
  • C++11 部分新特性

    空指针,能够和整数0进行区别,因为#define NULL 0 可推导出右值类型,从而得知左边变量类型。发生在编译阶段。 简单使用示例:  注意: (a)auto定义变量必须初始化,如下用法错误;  (b)auto不能定义自定义类型的成员变量,如下用法错误; (c)auto不能定义数组,如下

    2024年02月05日
    浏览(23)
  • C++ 11新特性之并发

    概述         随着计算机硬件的发展,多核处理器已经成为主流,对程序并发执行能力的需求日益增长。C++ 11标准引入了一套全面且强大的并发编程支持库,为开发者提供了一个安全、高效地利用多核CPU资源进行并行计算的新框架,极大地简化了多线程开发。 std::thread  

    2024年02月20日
    浏览(29)
  • 【Java基础教程】(七)面向对象篇 · 第一讲:上干货!面向对象的特性、类与对象、内存结构引用分析、垃圾收集器 GC处理、封装性详解、构造方法、匿名对象、简单 Java 类~

    程序是将数据和逻辑封装在一起的代码段。在Java中,方法是常用的代码段封装方式。然而,在Java中,方法必须存在于一个类中才能使用。因此,我们将进入本章的核心内容——面向对象编程。 利用面向对象设计的程序可以实现代码的重用,并方便开发者进行项目维护。面向

    2024年02月13日
    浏览(40)
  • 【C++】c++11新特性(一)

    目录 { }列表初始化 内置类型---对单值变量及数组的初始化 列表初始化时进行的类型转换 自定义类型---对类对象或结构的初始化 initializer_list 1. 定义接受 initializer_list 参数的构造函数 2. 在函数中使用 initializer_list 参数 3. 使用 initializer_list 与 vector 等容器 用于推断类型的关键

    2024年04月29日
    浏览(29)
  • C++ 11新特性之function

    概述         C++ 11标准库引入了许多创新功能,其中之一便是std::function。作为函数对象容器,std::function允许开发者在编译时不知道具体类型的情况下,存储和传递任意可调用对象,极大地提升了代码的灵活性和可复用性。本文将详细探讨std::function的工作原理、使用场景

    2024年01月18日
    浏览(44)
  • 【C++】—— 简述C++11新特性

    序言: 从本期开始,我将会带大家学习的是关于C++11 新增的相关知识!废话不多说,我们直接开始今天的学习。 目录 (一)C++11简介 (二)统一的列表初始化 1、{}初始化 2、std::initializer_list (三)声明 1、auto 2、decltype 3、nullptr (四)范围for循环 (五)STL中一些变化 总

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包