码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Java】Java 11 新特性概览


    Java 11 新特性概览

    • 1. Java 11 简介
    • 2. Java 11 新特性
      • 2.1 HTTP Client 标准化
      • 2.2 String 新增方法
        • (1)str.isBlank() - 判断字符串是否为空
        • (2)str.lines() - 返回由行终止符划分的字符串集合
        • (3)str.repeat(n) - 重复字符串多少次
        • (4)str.stripLeading() - 删除字符串前面的空格
        • (5)str.stripTrailing() - 删除字符串后面的空格
        • (6)str.strip() - 删除字符串前后的空格
      • 2.3 ZGC:可伸缩低延迟垃圾收集器
      • 2.4 Optional.isEmpty()
      • 2.5 lambda 参数的局部变量语法
      • 2.6 简化启动单个源代码文件的方法
      • 2.7 Epsilon 垃圾收集器
    • 3. 其他新特性

    1. Java 11 简介

    Java 11 于 2018 年 9 月 25 日正式发布,且为长期支持版本(Long-Term-Support - LTS)。

    下面为 Oracle Java SE 产品的一些关键产品日期示例(Oracle Java SE Product Releases):

    在这里插入图片描述

    2. Java 11 新特性

    2.1 HTTP Client 标准化

    Java 11 对 Java 9 中引入并在 Java 10 中更新的 Http Client API 进行了标准化,实现了几乎完全重写,并且现在是完全异步非阻塞的 (以前的 HTTP/1.1 的实现是阻塞的)。

    Http Client 的包名由 jdk.incubator.http 改为 java.net.http。该 API 通过 CompleteableFutures 提供非阻塞请求和响应语义。

    示例:

    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.baidu.com/"))
        .GET()
        .build();
    var client = HttpClient.newHttpClient();
    
    // 同步
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
    
    // 异步
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    JEP 321 HTTP Client (Standard)

    2.2 String 新增方法

    Java 11 新增了一些 String 方法:

    (1)str.isBlank() - 判断字符串是否为空

    class strMethodsTest {
        public static void main(String args[]) {
           String str1 = "";
           System.out.println(str1.isBlank());
    
           String str2 = "pointerJava";
           System.out.println(str2.isBlank());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:

    true
    false
    
    • 1
    • 2

    (2)str.lines() - 返回由行终止符划分的字符串集合

    import java.util.*;
     
    class strMethodsTest {
        public static void main(String args[]) {
            String str = "pointer\njava";
            System.out.println(str.lines().count());
        	System.out.println(str.lines().collect(Collectors.toList()));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:

    2
    pointer
    java
    
    • 1
    • 2
    • 3

    (3)str.repeat(n) - 重复字符串多少次

    class strMethodsTest {
        public static void main(String args[]) {
            String str = "pointerJava";
            System.out.println(str.repeat(2));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    pointerJavapointerJava
    
    • 1

    (4)str.stripLeading() - 删除字符串前面的空格

    class strMethodsTest {
        public static void main(String args[]) {
            String str = " pointerJava";
            System.out.println(str.stripLeading());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    pointerJava
    
    • 1

    (5)str.stripTrailing() - 删除字符串后面的空格

    class strMethodsTest {
        public static void main(String args[]) {
            String str = "pointerJava ";
            System.out.println(str.stripTrailing());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    pointerJava
    
    • 1

    (6)str.strip() - 删除字符串前后的空格

    class strMethodsTest {
        public static void main(String args[]) {
            String str = " pointerJava ";
            System.out.println(str.strip());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    pointerJava
    
    • 1

    2.3 ZGC:可伸缩低延迟垃圾收集器

    详细介绍可以参考美团技术团队创作的:《新一代垃圾回收器ZGC的探索与实践》

    JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)

    2.4 Optional.isEmpty()

    新增了 isEmpty() 方法来判断指定的 Optional 对象是否为空。

    var op = Optional.empty();
    System.out.println(op.isEmpty());
    
    • 1
    • 2

    2.5 lambda 参数的局部变量语法

    从 Java 10 开始,引入了局部变量类型推断(Local Variable Type Inference)功能,它可以让我们使用关键字 var 声明局部变量(而不是实际类型),而由编译器根据变量初始化的值自动推断出类型。

    Java 10 中对 var 关键字存在几个限制

    • 只能用于局部变量上
    • 声明时必须初始化
    • 不能用作方法参数
    • 不能在 Lambda 表达式中使用

    JDK 11 允许在 lambda 表达式中使用 var 进行参数声明:

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出结果都为:

    2
    6
    
    • 1
    • 2

    JEP 323: Local-Variable Syntax for Lambda Parameters

    2.6 简化启动单个源代码文件的方法

    该特性不需要首先使用javac工具编译java源文件。 你可以使用 Java 命令直接运行该文件,并隐式编译。

    例如:如果名为 HelloWorld.java 的文件包含一个名为 hello.World 的类,那么该命令:

    $ java HelloWorld.java
    
    • 1

    等同于:

    $ javac HelloWorld.java
    $ java -cp hello.World
    
    • 1
    • 2

    2.7 Epsilon 垃圾收集器

    Epsilon 垃圾收集器不执行任何实际的垃圾回收操作(没有实际的内存回收机制),它只是简单地分配内存并忽略所有的垃圾对象。这对于一些特殊的性能测试和调优场景可能很有用。

    使用场景:

    性能测试 :什么都不执行的 GC 非常适合用于 GC 的差异性分析。no-op (无操作)GC 可以用于过滤掉 GC 诱发的性能损耗,比如 GC 线程的调度,GC 屏障的消耗,GC 周期的不合适触发,内存位置变化等。此外有些延迟者不是由于 GC 引起的,比如 scheduling hiccups, compiler transition hiccups,所以去除 GC 引发的延迟有助于统计这些延迟。

    内存压力测试:在测试 Java 代码时,确定分配内存的阈值有助于设置内存压力常量值。这时 no-op 就很有用,它可以简单地接受一个分配的内存分配上限,当内存超限时就失败。例如:测试需要分配小于 1G 的内存,就使用-Xmx1g 参数来配置 no-op GC,然后当内存耗尽的时候就直接 crash。

    VM 接口测试:以 VM 开发视角,有一个简单的 GC 实现,有助于理解 VM-GC 的最小接口实现。它也用于证明 VM-GC 接口的健全性。

    极度短暂 job 任务:一个短声明周期的 job 任务可能会依赖快速退出来释放资源,这个时候接收 GC 周期来清理 heap 其实是在浪费时间,因为 heap 会在退出时清理。并且 GC 周期可能会占用一会时间,因为它依赖 heap 上的数据量。

    延迟改进:对那些极端延迟敏感的应用,开发者十分清楚内存占用,或者是几乎没有垃圾回收的应用,此时耗时较长的 GC 周期将会是一件坏事。

    吞吐改进:即便对那些无需内存分配的工作,选择一个 GC 意味着选择了一系列的 GC 屏障,所有的 OpenJDK GC 都是分代的,所以他们至少会有一个写屏障。避免这些屏障可以带来一点点的吞吐量提升。

    JEP 318: Epsilon: A No-Op Garbage Collector (Experimental)

    3. 其他新特性

    JDK 11 Release Notes:https://www.oracle.com/java/technologies/javase/11-relnote-issues.html

    Java 11 – Features and Comparison:https://www.geeksforgeeks.org/java-11-features-and-comparison/

  • 相关阅读:
    设计模式-行为型模式-策略模式
    启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。
    软文撰写技巧:中小企业品牌形象塑造新方法
    从零入门AI生图原理(一)(Datawhale X 魔搭 AI夏令营)
    RCD吸收电路的工作原理及参数计算方法详解
    Linux Kernel Module知识大全之一(基础)
    查看Visual Studio软件_MSC_VER值(MSVC编译器版本)的方法
    Python数据分析和挖掘之入门理论+实操
    使用 SpeechT5 进行语音合成、识别和更多功能
    数据结构复盘——第一章:绪论
  • 原文地址:https://blog.csdn.net/weixin_42201180/article/details/133951072
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号