Skip to content
JavaGuideJavaGuide
面试指南
优质专栏
项目精选
书籍精选
旧版链接open in new window
RSS订阅open in new window
关于作者
github icon
      • Java8 新特性实战
        • 《Java8指南》中文翻译
          • Java 9 新特性概览
            • Java 10 新特性概览
              • Java 11 新特性概览
                • Java 12 ~ 13 新特性概览
                  • Java 14 ~ 15 新特性概览
                    • Java14
                      • 空指针异常精准提示
                        • switch 的增强(转正)
                          • 预览新特性
                            • Java14 其他特性
                            • Java15
                              • CharSequence
                                • TreeMap
                                  • ZGC(转正)
                                    • EdDSA(数字签名算法)
                                      • 文本块(转正)
                                        • 隐藏类(Hidden Classes)
                                          • 预览新特性
                                            • Java15 其他新特性
                                            • 总结
                                              • 关于预览特性
                                                • JVM 虚拟机优化
                                                • 参考

                                            Java 14 ~ 15 新特性概览

                                            author iconGuidecategory icon
                                            • Java
                                            tag icon
                                            • Java新特性
                                            calendar icon2022年3月1日word icon约 2010 字

                                            此页内容
                                            • Java14
                                              • 空指针异常精准提示
                                              • switch 的增强(转正)
                                              • 预览新特性
                                              • Java14 其他特性
                                            • Java15
                                              • CharSequence
                                              • TreeMap
                                              • ZGC(转正)
                                              • EdDSA(数字签名算法)
                                              • 文本块(转正)
                                              • 隐藏类(Hidden Classes)
                                              • 预览新特性
                                              • Java15 其他新特性
                                            • 总结
                                              • 关于预览特性
                                              • JVM 虚拟机优化
                                            • 参考

                                            # Java14

                                            # 空指针异常精准提示

                                            通过 JVM 参数中添加-XX:+ShowCodeDetailsInExceptionMessages,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。

                                            a.b.c.i = 99; // 假设这段代码会发生空指针
                                            
                                            1

                                            Java 14 之前:

                                            Exception in thread "main" java.lang.NullPointerException
                                                at NullPointerExample.main(NullPointerExample.java:5)
                                            
                                            1
                                            2

                                            Java 14 之后:

                                             // 增加参数后提示的异常中很明确的告知了哪里为空导致
                                            Exception in thread "main" java.lang.NullPointerException:
                                                    Cannot read field 'c' because 'a.b' is null.
                                                at Prog.main(Prog.java:5)
                                            
                                            1
                                            2
                                            3
                                            4

                                            # switch 的增强(转正)

                                            Java12 引入的 switch(预览特性)在 Java14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用。

                                            Java12 为 switch 表达式引入了类似 lambda 语法条件匹配成功后的执行块,不需要多写 break ,Java13 提供了 yield 来在 block 中返回值。

                                            String result = switch (day) {
                                                        case "M", "W", "F" -> "MWF";
                                                        case "T", "TH", "S" -> "TTS";
                                                        default -> {
                                                            if(day.isEmpty())
                                                                yield "Please insert a valid day.";
                                                            else
                                                                yield "Looks like a Sunday.";
                                                        }
                                            
                                                    };
                                            System.out.println(result);
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12

                                            # 预览新特性

                                            # record 关键字

                                            record 关键字可以简化 数据类(一个 Java 类一旦实例化就不能再修改)的定义方式,使用 record 代替 class 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 toString(),hashCode(), equals()方法

                                            类似于使用 class 定义类,同时使用了 lombok 插件,并打上了@Getter,@ToString,@EqualsAndHashCode注解

                                            /**
                                             * 这个类具有两个特征
                                             * 1. 所有成员属性都是final
                                             * 2. 全部方法由构造方法,和两个成员属性访问器组成(共三个)
                                             * 那么这种类就很适合使用record来声明
                                             */
                                            final class Rectangle implements Shape {
                                                final double length;
                                                final double width;
                                            
                                                public Rectangle(double length, double width) {
                                                    this.length = length;
                                                    this.width = width;
                                                }
                                            
                                                double length() { return length; }
                                                double width() { return width; }
                                            }
                                            /**
                                             * 1. 使用record声明的类会自动拥有上面类中的三个方法
                                             * 2. 在这基础上还附赠了equals(),hashCode()方法以及toString()方法
                                             * 3. toString方法中包括所有成员属性的字符串表示形式及其名称
                                             */
                                            record Rectangle(float length, float width) { }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12
                                            13
                                            14
                                            15
                                            16
                                            17
                                            18
                                            19
                                            20
                                            21
                                            22
                                            23
                                            24

                                            # 文本块

                                            Java14 中,文本块依然是预览特性,不过,其引入了两个新的转义字符:

                                            • \ : 表示行尾,不引入换行符
                                            • \s :表示单个空格
                                            String str = "凡心所向,素履所往,生如逆旅,一苇以航。";
                                            
                                            String str2 = """
                                                    凡心所向,素履所往, \
                                                    生如逆旅,一苇以航。""";
                                            System.out.println(str2);// 凡心所向,素履所往, 生如逆旅,一苇以航。
                                            String text = """
                                                    java
                                                    c++\sphp
                                                    """;
                                            System.out.println(text);
                                            //输出:
                                            java
                                            c++ php
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12
                                            13
                                            14

                                            # instanceof 增强

                                            依然是预览特性 ,Java 12 新特性中介绍过。

                                            # Java14 其他特性

                                            • 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS 和 Window(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了,虽然其实 G1 也够用)
                                            • 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
                                            • 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的deb和rpm,window 平台下的msi和exe

                                            # Java15

                                            # CharSequence

                                            CharSequence 接口添加了一个默认方法 isEmpty() 来判断字符序列为空,如果是则返回 true。

                                            public interface CharSequence {
                                              default boolean isEmpty() {
                                                  return this.length() == 0;
                                              }
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5

                                            # TreeMap

                                            TreeMap 新引入了下面这些方法:

                                            • putIfAbsent()
                                            • computeIfAbsent()
                                            • computeIfPresent()
                                            • compute()
                                            • merge()

                                            # ZGC(转正)

                                            Java11 的时候 ,ZGC 还在试验阶段。

                                            当时,ZGC 的出现让众多 Java 开发者看到了垃圾回收器的另外一种可能,因此备受关注。

                                            经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java 15 已经可以正式使用了!

                                            不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启动 ZGC:

                                            $ java -XX:+UseZGC className
                                            
                                            1

                                            # EdDSA(数字签名算法)

                                            新加入了一个安全性和性能都更强的基于 Edwards-Curve Digital Signature Algorithm (EdDSA)实现的数字签名算法。

                                            虽然其性能优于现有的 ECDSA 实现,不过,它并不会完全取代 JDK 中现有的椭圆曲线数字签名算法( ECDSA)。

                                            KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
                                            KeyPair kp = kpg.generateKeyPair();
                                            
                                            byte[] msg = "test_string".getBytes(StandardCharsets.UTF_8);
                                            
                                            Signature sig = Signature.getInstance("Ed25519");
                                            sig.initSign(kp.getPrivate());
                                            sig.update(msg);
                                            byte[] s = sig.sign();
                                            
                                            String encodedString = Base64.getEncoder().encodeToString(s);
                                            System.out.println(encodedString);
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12

                                            输出:

                                            0Hc0lxxASZNvS52WsvnncJOH/mlFhnA8Tc6D/k5DtAX5BSsNVjtPF4R4+yMWXVjrvB2mxVXmChIbki6goFBgAg==
                                            
                                            1

                                            # 文本块(转正)

                                            在 Java 15 ,文本块是正式的功能特性了。

                                            # 隐藏类(Hidden Classes)

                                            隐藏类是为框架(frameworks)所设计的,隐藏类不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们。

                                            # 预览新特性

                                            # 密封类

                                            Java 15 对 Java 14 中引入的预览新特性进行了增强,主要是引入了一个新的概念 密封类(Sealed Classes)。

                                            密封类可以对继承或者实现它们的类进行限制。

                                            比如抽象类 Person 只允许 Employee 和 Manager 继承。

                                            public abstract sealed class Person
                                                permits Employee, Manager {
                                            
                                                //...
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5

                                            另外,任何扩展密封类的类本身都必须声明为 sealed、non-sealed 或 final。

                                            public final class Employee extends Person {
                                            }
                                            
                                            public non-sealed class Manager extends Person {
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5

                                            如果允许扩展的子类和封闭类在同一个源代码文件里,封闭类可以不使用 permits 语句,Java 编译器将检索源文件,在编译期为封闭类添加上许可的子类。

                                            # instanceof 模式匹配

                                            Java 15 并没有对此特性进行调整,继续预览特性,主要用于接受更多的使用反馈。

                                            在未来的 Java 版本中,Java 的目标是继续完善 instanceof 模式匹配新特性。

                                            # Java15 其他新特性

                                            • Nashorn JavaScript 引擎彻底移除 :Nashorn 从 Java8 开始引入的 JavaScript 引擎,Java9 对 Nashorn 做了些增强,实现了一些 ES6 的新特性。在 Java 11 中就已经被弃用,到了 Java 15 就彻底被删除了。
                                            • DatagramSocket API 重构
                                            • 禁用和废弃偏向锁(Biased Locking) : 偏向锁的引入增加了 JVM 的复杂性大于其带来的性能提升。不过,你仍然可以使用 -XX:+UseBiasedLocking 启用偏向锁定,但它会提示 这是一个已弃用的 API。
                                            • ......

                                            # 总结

                                            # 关于预览特性

                                            先贴一段 oracle 官网原文:This is a preview feature, which is a feature whose design, specification, and implementation are complete, but is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases. To compile and run code that contains preview features, you must specify additional command-line options.

                                            这是一个预览功能,该功能的设计,规格和实现是完整的,但不是永久性的,这意味着该功能可能以其他形式存在或在将来的 JDK 版本中根本不存在。 要编译和运行包含预览功能的代码,必须指定其他命令行选项。

                                            就以switch的增强为例子,从 Java12 中推出,到 Java13 中将继续增强,直到 Java14 才正式转正进入 JDK 可以放心使用,不用考虑后续 JDK 版本对其的改动或修改

                                            一方面可以看出 JDK 作为标准平台在增加新特性的严谨态度,另一方面个人认为是对于预览特性应该采取审慎使用的态度。特性的设计和实现容易,但是其实际价值依然需要在使用中去验证

                                            # JVM 虚拟机优化

                                            每次 Java 版本的发布都伴随着对 JVM 虚拟机的优化,包括对现有垃圾回收算法的改进,引入新的垃圾回收算法,移除老旧的不再适用于今天的垃圾回收算法等

                                            整体优化的方向是高效,低时延的垃圾回收表现

                                            对于日常的应用开发者可能比较关注新的语法特性,但是从一个公司角度来说,在考虑是否升级 Java 平台时更加考虑的是JVM 运行时的提升

                                            # 参考

                                            • Oracle Java14 record https://docs.oracle.com/en/java/javase/14/language/records.htmlopen in new window
                                            • java14-features https://www.techgeeknext.com/java/java14-featuresopen in new window
                                            • Java 14 Features : https://www.journaldev.com/37273/java-14-featuresopen in new window
                                            • What is new in Java 15: https://mkyong.com/java/what-is-new-in-java-15/
                                            edit icon编辑此页open in new window
                                            上次编辑于: 2022/3/1 下午6:16:51
                                            贡献者: guide
                                            上一页
                                            Java 12 ~ 13 新特性概览
                                            鄂ICP备2020015769号-1
                                            Copyright © 2022 Guide