行业资讯 2025年08月6日
0 收藏 0 点赞 944 浏览 3958 个字
摘要 :

文章目录 1、JDK17对switch语句的增强 1)支持返回值 2)switch开始支持instanceof 2、JDK17对多行字符串支持 3、JDK17 instanceof增强 4、密封类 5、Record类 6、优……




  • 1、JDK17对switch语句的增强
    • 1)支持返回值
    • 2)switch开始支持instanceof
  • 2、JDK17对多行字符串支持
  • 3、JDK17 instanceof增强
  • 4、密封类
  • 5、Record
  • 6、优化了空指针异常信息
  • 7、ZGC垃圾回收器
  • 总结

你是不是还在使用JDK8版本写着JDK5的代码?现在比较流行的LTS(长期支持版)目前有两个JDK11和JDK17,如果新项目立项大趋势基本是JDK17了,毕竟JDK17真的是太香了,非常有必要和大家介绍总结下JDK17必须要学习和掌握的一些新特性,不然真的就out啦!

当然这些部分新特性,可能是在11、12、13等等版本中就出现了,但是对于从JDK8转过来的小伙伴还是非常有必要在此处汇总下,一起放到JDK17中去演示,我们一起来看下吧。

1、JDK17对switch语句的增强

1)支持返回值

原写法:

@Test
void testSwitch(){
    String day = \"MONDAY\";
    switch (day) {
        case \"MONDAY\":
            System.out.println(\"星期1\");
            break;
        case \"TUESDAY\":
            System.out.println(\"星期2\");
            break;
        case \"WEDNESDAY\":
            System.out.println(\"星期3\");
            break;
        case \"THURSDAY\":
            System.out.println(\"星期4\");
            break;
        case \"FRIDAY\":
            System.out.println(\"星期5\");
            break;
        case \"SATURDAY\":
            System.out.println(\"星期6\");
            break;
        case \"SUNDAY\":
            System.out.println(\"星期7\");
            break;
        default:
            System.out.println(\"未知\");
            break;
    }
}

JDK17新写法:

//单匹配,不用再写break,支持返回值
@Test
void testSwitch(){
    String day = \"MONDAY\";
    String i = switch (day) {
        case \"MONDAY\" -> \"星期1\";
        case \"TUESDAY\" -> \"星期2\";
        case \"WEDNESDAY\" -> \"星期3\";
        case \"THURSDAY\" -> \"星期4\";
        case \"FRIDAY\" -> \"星期5\";
        case \"SATURDAY\" -> \"星期6\";
        case \"SUNDAY\" -> \"星期7\";
        default -> \"未知\";
    };
    System.out.println(i);
}
// 执行多行代码并返回,使用yield返回
@Test
void testSwitch(){
    String day = \"MONDAY\";
    String i = switch (day) {
        case \"MONDAY\" -> {
          System.out.println(\"又要上班了...\");
          yield \"星期1\";
        };
        case \"TUESDAY\" -> \"星期2\";
        case \"WEDNESDAY\" -> \"星期3\";
        case \"THURSDAY\" -> \"星期4\";
        case \"FRIDAY\" -> \"星期5\";
        case \"SATURDAY\" -> \"星期6\";
        case \"SUNDAY\" -> \"星期7\";
        default -> \"未知\";
    };
    System.out.println(i);
}
// 多匹配,直接逗号分割
@Test
void testSwitch(){
    String day = \"MONDAY\";
    int i = switch (day) {
        case \"MONDAY\" -> \"星期 1\";
        case \"TUESDAY\" ->  \"星期2\";
        case \"WEDNESDAY\" ->  \"星期3\";
        case \"THURSDAY\" ->  \"星期4\";
        case \"FRIDAY\" ->  \"星期5\";
        case \"SATURDAY\",\"SUNDAY\" ->  \"周末\";
        default -> \"未知\";
    };
    System.out.println(i);
}

2)switch开始支持instanceof

switch (obj) {
    case Integer i -> System.out.println(i);
    case Long l -> System.out.println(l);
    case Double d -> System.out.println(d);
    case String s -> System.out.println(s);
    default -> System.out.println(\"UNKNOWN\");
}

2、JDK17对多行字符串支持

以前一行字符串太长需要换行的写法:

String html = \"<html>\\n\" +
        \"   <body>\\n\" +
        \"       <h1>hello world</h1>\\n\" +
        \"   </body>\\n\" +
        \"</html>\\n\";

JDK17之后可以直接使用\"\"\"

String html =\"\"\"
<html>
   <body>
       <h1>hello world</h1>
   </body>
</html>
\"\"\"

注意:

\\:置于行尾,用来将两行连接为一行
\\s:单个空白字符

如果需要拼接变量还是只能在字符串内部使用%s占位符替代,然后使用String.format(html,\"替换内容\")

3、JDK17 instanceof增强

现在判断类型如果满足该类型可以直接赋值,无需再强制转换。

原写法:

Object obj = 1;
if(obj instanceof Integer) {
    Integer i = (Integer) obj;
    System.out.println(i.intValue());
}else if(obj instanceof String){
    String s = (String) obj;
    System.out.println(s);
}

现写法:

Object obj = 1;
if(obj instanceof Integer i) {
    System.out.println(i.intValue());
}else if(obj instanceof String s){
    System.out.println(s);
}

是不是非常的方便简洁。

4、密封类

密封类可以理解为限制继承类,可以指定该类只能被某些子类继承,语法类似如下:
Person类被 sealed 修饰,只允许(permits)Male和Female类继承,继承的类必须有 final 或者 no-sealed 来修饰。

public static void main(String[] args) {
    Male male = new Male();
    male.eat();

    Female female = new Female();
    female.eat();
}

public abstract sealed class Person permits Male, Female {
    abstract void eat();
}

public final class Male extends Person {
    @Override
    public void eat() {
        System.out.println(\"male eat\");
    }
}

public  non-sealed class Female extends Person {
    @Override
    public void eat() {
        System.out.println(\"female eat\");
    }
}

 

以上Person就是个密封类,限制只允许Male和Female类继承。

注意:
1)接口被也支持被 sealed 修饰

2)这3个类必须要在同一个包下,而且Male和Feamle不能间接继承Person,必须直接继承。

3)no-sealed修饰的子类可以被继续继承

5、Record类

Record类类似Lombok属性只读对象,只有get方法,没有set方法,演示如下:

// record 坐标类
public record Coordinate(int x,int y){
        
}
// 创建对象
@Test
void test(){
    Coordinate c1 = new Coordinate(1,2);
    Coordinate c2 = new Coordinate(1,2);
    //注意不是getX()
    System.out.println(c1.x());
    // 我们会发现equals打印结果是true,因为重写了equals,属性值相同则认为相等
    System.out.println(c1.equals(c2));
}

6、优化了空指针异常信息

以前如果多个对象连续调用方法或属性,如果改行代码报空指针,很难确定是哪个对象报的,现在JDK17在异常信息中直接帮你定位到哪个对象报的NPE异常,真是太方便了,妈妈再也不用担心我找不到空指针异常了。

比如执行代码:employee.department().company().name() 报NPE,直接定位到时company()方法为null导致了。

JDK17必须要学习掌握的新特性汇总

7、ZGC垃圾回收器

JDK17的ZGC垃圾回收器性能强劲,垃圾回收不卡顿,Java开发不用愁。

JDK17必须要学习掌握的新特性汇总

通过以上吞吐量指标,我们可以看到与旧版本相比,所有收集器都有了明显的进步,其中ZGC的提升最大。在此次测试中,G1和 Parallel的原始吞吐量更好,但增大了堆空间后,ZGC 弥补了这一差距。

注意:添加以下VM选项即可开启ZGC:

-XX:+UseZGC

总结

以上就是JDK17的新特性,是不非常的强大有实用,如果你是开发新项目,会选择使用JDK17吗?如果会,那赶紧学习起来吧!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/8783.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号