zoukankan      html  css  js  c++  java
  • Java 14 新功能介绍

    点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。

    本文 Github.com/niumoo/JavaNotes未读代码博客 已经收录,有很多知识点和系列文章。

    Java 14, 图片来自 medium.com

    不做标题党,认认真真写个文章。
    文章已经收录在 Github.com/niumoo/JavaNotes未读代码博客,点关注,不迷路。

    Java 14 早在 2019 年 9 月就已经发布,虽然不是长久支持版本,但是也带来了不少新功能。

    Java 14 官方下载:https://jdk.java.net/archive/

    Java 14 官方文档:https://openjdk.java.net/projects/jdk/14/

    Java 14 新功能:

    • 305: instanceof 类型判断(预览)
    • 343: 打包工具(孵化)
    • 345: G1 支持 NUMA(非统一内存访问)
    • 358: 更有用的 NullPointerExceptions
    • 359: Records (预览)
    • 361: Switch 表达式 (标准)
    • 362: 废弃对 Solaris 和 SPARC 端口支持
    • 363: 移除 CMS 垃圾收集器
    • 364: macOS 的 ZGC
    • 365: Windows 的 ZGC
    • 366: 弃用 ParallelScavenge + SerialOld GC 组合
    • 367: 删除 Pack200 Tools 和 API
    • 368: 文本块 (二次预览)
    • 370: Foreign-Memory Access API (Incubator)
    • 349: JFR Event Streaming
    • 352: Non-Volatile Mapped Byte Buffers

    注意: 如果一个功能为预览版,那么在编译和运行时需要打开预览功能。

    ./javac --enable-preview --release 14 Test.java
    ./java --enable-preview Test
    

    此文章属于 Java 新特性教程 系列,会介绍 Java 每个版本的新功能,可以点击浏览。

    1. JEP 305:instanceof 类型判断(预览)

    在 Java 14 之前,使用 instanceof 进行类型判断之后,需要进行对象类型转换后才能使用。

    package com.wdbyte;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Java14BeaforInstanceof {
    
        public static void main(String[] args) {
            Object obj = new ArrayList<>();
            if (obj instanceof ArrayList) {
                ArrayList list = (ArrayList)obj;
                list.add("www.wdbyte.com");
            }
            System.out.println(obj);
        }
    }
    

    而在 Java 14 中,可以在判断类型时指定变量名称进行类型转换,方便了使用。

    package com.wdbyte;
    
    import java.util.ArrayList;
    
    public class Java14Instanceof {
        public static void main(String[] args) {
            Object obj = new ArrayList<>();
            if (obj instanceof ArrayList list) {
                list.add("www.wdbyte.com");
            }
            System.out.println(obj);
        }
    }
    

    可以看到,在使用 instanceof 判断类型成立后,会自动强制转换类型为指定类型。

    输出结果:

    [www.wdbyte.com]
    

    这个特性在 Java 14 中还是预览功能,在 Java 16 中正式转正。

    2. JEP 343:打包工具(孵化)

    在 Java 14 中,引入了打包工具,命令是 jpackage,使用 jpackage 命令可以把 JAR 包打包成不同操作系统支持的软件格式。

    jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main
    

    常见平台格式如下:

    1. Linux: deb and rpm
    2. macOS: pkg and dmg
    3. Windows: msi and exe

    要注意的是,jpackage 不支持交叉编译,也就是说在 windows 平台上是不能打包成 macOS 或者 Linux 系统的软件格式的。

    3. JEP 345: G1 支持 NUMA(非统一内存访问)

    G1 收集器现在可以感知 NUMA 内存分配方式,以提高 G1 的性能,可以使用 +XX:+UseNUMA 启用这项功能。

    扩展阅读:https://openjdk.java.net/jeps/345

    4. JEP 358:更有用的 NullPointerExceptions

    NullPointerException 一直都是一个比较常见的异常,但是在 Java 14 之前,如果一行有多个表达式时,这时报了空指针后,单纯的从报错信息来看,可能并不知道是哪个对象为 NULL ,下面是一个演示。

    package com.wdbyte;
    
    public class Java14NullPointerExceptions {
    
        public static void main(String[] args) {
            String content1 = "www.wdbyte.com";
            String content2 = null;
            int length = content1.length() + content2.length();
            System.out.println(length);
        }
    }
    

    在 Java 14 之前,从下面的报错中我们只能得到错误出现的行数,但是并不能确定是 conteng1 还是 content2null

    Exception in thread "main" java.lang.NullPointerException
    	at com.alibaba.security.astralnet.console.controller.ApiChartsTest.main(Java14NullPointerExceptions.java:8)
    

    但是在 Java 14 中,会清晰的告诉你 because "content2" is null

    Exception in thread "main" java.lang.NullPointerException: 
    	Cannot invoke "String.length()" because "content2" is null
    	at com.wdbyte.Java14NullPointerExceptions.main(Java14NullPointerExceptions.java:8)
    

    5. JEP 359:Records (预览)

    record 是一种全新的类型,它本质上是一个 final 类,同时所有的属性都是 final 修饰,它会自动编译出 public get hashcodeequalstoString 等方法,减少了代码编写量。

    示例:编写一个 Dog record 类,定义 name 和 age 属性。

    package com.wdbyte;
    
    public record Dog(String name, Integer age) {
    }
    

    Record 的使用。

    package com.wdbyte;
    
    public class Java14Record {
    
        public static void main(String[] args) {
            Dog dog1 = new Dog("牧羊犬", 1);
            Dog dog2 = new Dog("田园犬", 2);
            Dog dog3 = new Dog("哈士奇", 3);
            System.out.println(dog1);
            System.out.println(dog2);
            System.out.println(dog3);
        }
    }
    

    输出结果:

    Dog[name=牧羊犬, age=1]
    Dog[name=田园犬, age=2]
    Dog[name=哈士奇, age=3]
    

    这个功能在 Java 15 中进行二次预览,在 Java 16 中正式发布。

    6. JEP 361:Switch 表达式 (标准)

    Switch 表达式改进从 Java 12 就已经开始了,Java 12 让 switch 支持了 L-> 语法,Java 13 引入了 yield 关键词用于返回结果,但是在 Java 12 和 13 中功能都是预览版的,而在 Java 14 中,正式转正。

    // 通过传入月份,输出月份所属的季节
    public static String switchJava12(String month) {
         return switch (month) {
            case "march", "april", "may"            -> "春天";
            case "june", "july", "august"           -> "夏天";
            case "september", "october", "november" -> "秋天";
            case "december", "january", "february"  -> "冬天";
            default -> "month erro";
        };
    }
    // 通过传入月份,输出月份所属的季节
    public static String switchJava13(String month) {
        return switch (month) {
            case "march", "april", "may":
                yield "春天";
            case "june", "july", "august":
                yield "夏天";
            case "september", "october", "november":
                yield "秋天";
            case "december", "january", "february":
                yield "冬天";
            default:
                yield "month error";
        };
    }
    

    扩展阅读:Java 12 新特性介绍Java 13 新功能介绍JEP 325: Switch 表达式

    7. JEP 368:文本块(二次预览)

    文本块是 Java 13 引入的语法,在 Java 14 中对其进行了增强。文本块依旧是预览功能,这次更新增加了两个转义符。

    1. 结尾不换行
    2. s 表示一个空格

    示例:文本块体验

    String content = """
            {
                "upperSummary": null,
                "sensitiveTypeList": null,
                "gmtModified": "2011-08-05s10:50:09",
            }
             """;
    System.out.println(content);
    

    输出结果:

    {
        "upperSummary": null,    "sensitiveTypeList": null,
        "gmtModified": "2011-08-05 10:50:09",
    }
    

    文本块功能在 Java 15 中正式发布。

    其他更新

    JEP 362:废弃对 Solaris 和 SPARC 端口支持

    从 Java 14 开始,放弃对 Solaris/SPARC, Solaris/x64, 和 Linux/SPARC 端口的支持,放弃一部分开发这势必会加快 Java 整体的开发节奏。

    相关阅读:https://openjdk.java.net/jeps/362

    JEP 363: 移除 CMS 垃圾收集器

    移除对 CMS(Concurrent Mark Sweep) 垃圾收集器的支持,其实早在 Java 9 就开始移除 CMS 垃圾收集器了,只不过在 Java 14 中被正式删除。

    JEP 364:macOS 上的 ZGC(实验性)

    Java 11 在 Linux 上引入了 Z 垃圾收集器 (ZGC),现在它可以移植到 macOS。

    JEP 365:Windows 上的 ZGC(实验性)

    Java 11 在 Linux 上引入了 Z 垃圾收集器 (ZGC),现在它可以移植到 Windows 上(版本大于 1803)。

    JEP 366:弃用 ParallelScavenge + SerialOld GC 组合

    由于使用场景不多,维护工作太大,废弃之。相关阅读:https://openjdk.java.net/jeps/366

    JEP 367:删除 Pack200 工具和 API

    参考

    1. https://openjdk.java.net/projects/jdk/14/
    2. https://openjdk.java.net/jeps/366
    3. https://openjdk.java.net/jeps/362
    4. Java 新特性教程

    <完>

    Hello world : ) 我是阿朗,一线技术工具人,认认真真写文章。

    点赞的个个都是人才,不仅长得帅气好看,说话还好听。


    文章持续更新,可以关注公众号「 程序猿阿朗 」或访问「未读代码博客 」。

    回复【资料】有我准备的各系列知识点和必看书籍。

    本文 Github.com/niumoo/JavaNotes 已经收录,有很多知识点和系列文章,欢迎Star。

    等你好久

  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/niumoo/p/15130699.html
Copyright © 2011-2022 走看看