当我从jdk8过渡到jdk17有哪些明显的变化

Posted yuec1998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我从jdk8过渡到jdk17有哪些明显的变化相关的知识,希望对你有一定的参考价值。


注:文中很多功能并不是jdk17才有的新功能,而是阐述我在jdk8过渡到jdk17的过程中,对我编程带来的新特性的感受 ~

1、jshell的便利


jshell并不是jdk17才有的功能,有些时候你会爱上他,例如有时候想写一段测试的代码,你得打开idea,然后在原项目里面建一个类并在main方法里面写下你的demo,写完还要编译运行,但是有了jshell,你只需要双击打开,就可以直接在界面进行编程,而且功能十分强大

编辑器重度依赖,没有提示?按下tab,也会有的提示的

你也可以输入/help,查看jshell还有哪些的功能

2、var 语法糖的引入

var并不是java关键字,是一个语法糖,可以在代码书写过程中节省很多代码工作量,例如我们新建一个类,我们不再需要Object o = new Object(); 可以利用var语法,根据等号右边的对象类型自己推断生成对应类型。

而且var新建的变量只会根据等号右边的类型进行推断生成,并且如果var的右边是数字(整形),那么会生成基本类型int,而不是Integer

3、文本块的引入

    @Test
    void testStr()
        String txtOld = "\\n" +
                "\\"name\\":\\"网站\\",\\n" +
                "\\"num\\":3,\\n" +
                "\\"sites\\":[ \\"Google\\", \\"FileFox\\", \\"Edge\\" ]\\n" +
                "";
        System.out.println(txtOld);
        String txtNew = """
                
                "name":"网站",
                "num":3,
                "sites":[ "Google", "Runoob", "Taobao" ]
                
                """;
        System.out.println(txtNew);
    

输出结果:
使用3个引号 “”“文本”"" 代表文本块的输入,同时还有2种转义,使用“\\”可以取消换行,“\\s”可以增加空格

    @Test
    void testStr() 
        String txtOld = "\\n" + "\\"name\\":\\"网站\\",\\n" + "\\"num\\":3,\\n" + "\\"sites\\":[ \\"Google\\", \\"FileFox\\", \\"Edge\\" ]\\n" + "";
        System.out.println(txtOld);
        String txtNew = """
                \\s\\
                "name":"网站",\\
                "num":3,\\
                "sites":[ "Google"]\\s\\
                \\
                """;
        System.out.println(txtNew);
    

输出结果:

 "name":"网站","num":3,"sites":[ "Google"] 

4、switch表达式

使用->来代替以前的break

    @Test
    void testSwitch()
        Week day = Week.FRIDAY;
        switch (day)
            case MONDAY,TUESDAY,WEDNESDAY,THURSDAY -> System.out.println("red");
            case FRIDAY -> System.out.println("yellow");
            case SATURDAY,SUNDAY -> System.out.println("green");
            default -> throw new IllegalStateException("what day is today?"+day);
        
    

引入了yield关键字,类似于return返回结果值

    @Test
    void testSwitch() 
        Week day = Week.FRIDAY;
        String mood = switch (day) 
            case MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> "red";
            case FRIDAY -> "yellow";
            case SATURDAY, SUNDAY -> "green";
            default -> 
                if (day == null) 
                    throw new NullPointerException("you input null");
                 else 
                    System.out.println("what day is today?" + day);
                    yield "blue";
                
            
        ;
        System.out.println("your mood color is " + mood);
    

5、records的引入

与我们用lombok注解的功能一致。但个人还是习惯在实体类上使用@Data注解,因为如果参数多了,这种写法一点都不优雅,并且缺少对参数的注解
![在这里插入图片描述](https://img-blog.csdnimg.cn/13cf0eabaed94c5588dde85916cb8d05.png

/**
 * 类似于
 * @Data
 * public class Person
 *     private String name;
 *     private Integer age;
 * 
 */
public record Person(String name ,Integer age) 


    @Test
    void testRecord()
        Person yuec = new Person("yuec", 123);
        System.out.println(yuec);
    

输出结果:

Person[name=yuec, age=123]

6、ZGC

略。

待完善,评论区可补充~

以上是关于当我从jdk8过渡到jdk17有哪些明显的变化的主要内容,如果未能解决你的问题,请参考以下文章

从JDK 8到JDK 17,GC都有哪些进步?

JDK8到JDK17有哪些吸引人的新特性?

ConcurentHashMap为何是线程安全的,从JDK7到JDK8都做了哪些调整?

Java11新特性解读

Jdk8的新特性

JDK8飞到JDK17版本介绍和踩坑记录