JDK8-JDK17新特性一览

官方文档:https://openjdk.org/projects

一、JDK8新特性

1、Lambda表达式

2、函数式编程

3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法

4、方法引用

5、重复注解,同一个注解可以使用多次

6、引入Optional来避免空指针

7、引入Streams相关的API

8、引入新的Date/Time相关的API

9、新增jdeps命令行,来分析类、目录、jar包的类依赖层级关系

10、JVM使用MetaSpace代替了永久代(PermGen Space)

二、JDK9新特性

1、接口方法可以使用private来修饰

复制代码
public interface InterfaceTest {
    void getString();
    default String getTest() {
        return "";
    }

    /**
     * jdk9新特性,接口方法可以使用private来修饰
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: java.lang.String
     **/
    private String getTest2() {
        return "";
    }
}
复制代码

 

2、设置G1为JVM默认垃圾收集器

3、支持http2.0和websocket的API

 

HTTP/2的多路复用和HTTP1.1中的长连接复用有什么区别?

  • HTTP/1.0 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
  • HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
  • HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;
 

http2.0:https://cloud.tencent.com/developer/article/2040982

重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器

三、JDK10新特性

1、局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型

复制代码
 /**
     * JDK10 局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testVar() {
         var list = new ArrayList<>();
         var stream = list.stream();          // infers Stream<String>
    }
复制代码

 

2、并行Full GC,来优化G1的延迟

3、允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程

重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间

四、JDK11新特性

1、ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)

2、Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架

3、对Stream、Optional、集合API进行增强

重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器

复制代码
/**
     * JDK11 list新增API
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testList() {
        List<String> stringList = List.of("a", "b", "c");
//        stringList.remove("c");
//        stringList.add("d"); 注意这里返回的list不是java.util下的list 不可继续add或remove元素
        System.out.println(stringList);
    }

    /**
     * JDK11 list新增API
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testStream() {
        List<String> stringList = new ArrayList<>();
        stringList.add("a");
        stringList.add("b");
        stringList.add("a");
        stringList.add("c");
        stringList.add("d");
        System.out.println(stringList);
        // 流中获取判定为真的元素,判定为假的时候 就停止判定
        List<String> collect = stringList.stream().takeWhile(s -> s.equalsIgnoreCase("a")).collect(Collectors.toList());
        System.out.println(collect);
        // 从流中获取为假的元素,判定为真丢弃,直到判定为假,停止判定
        List<String> strings = stringList.stream().dropWhile(s -> s.equalsIgnoreCase("a")).collect(Collectors.toList());
        System.out.println(strings);
        //无限流通过中间的判断创建有限流
        List<Integer> collect1 = Stream.iterate(1, t -> t * 3 + 1).limit(3).collect(Collectors.toList());
        System.out.println(collect1);

    }

    @Test
    public void testStreamofNull() {
        String str = null;
        Stream<String> stream = Stream.of(str);
        System.out.print("of: ");
        stream.forEach(System.out::println);
        //创建流的时候可传入null 防止出现空指针异常
        Stream<String> stream2 = Stream.ofNullable(str);
        System.out.print("ofNullable: ");
        stream2.forEach(System.out::println);
    }
复制代码

五、JDK12新特性

1、Shenandoah GC,新增的GC算法

2、switch 表达式语法扩展,可以有返回值

复制代码
/**
     * JDK12 switch 表达式语法扩展,可以有返回值
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testSwitch() {
        int i = switch (MONDAY) {
            case MONDAY -> 1;
            case TUESDAY -> 2;
            case WEDNESDAY  -> 3;
            case THURSDAY -> 4;
            case FRIDAY -> 5;
            case SATURDAY -> 6;
            case SUNDAY -> 7;
        };
        System.out.println(i);
    }
复制代码

 

3、G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率

重要特性:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法

五、JDK13新特性

1、Socket的底层实现优化,引入了NIO;

NIO: https://www.cnblogs.com/mikechenshare/p/16587635.html

 

BIO

BIO全称是Blocking IO,同步阻塞式IO,是JDK1.4之前的传统IO模型。

Java BIO:服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,

NIO

Java NIO: 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。

2、switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break;

复制代码
   /**
     * JDK13 2、switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break;
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testSwitchYield() {
        int errorCode = 404;
        String message = switch (errorCode) {
            case 404:
                yield "Not found!";
            case 500:
                yield "Internal server error!";
                // No default
            default:
                throw new IllegalStateException("Unexpected value: " + errorCode);
        };
        System.out.println(message);
    }
复制代码

 

3、ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统;

4、引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符;

复制代码
/**
     * JDK13,引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符;
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testTextField() {
        System.out.println("""
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """);

        System.out.println("<html>\n" +
            "    <body>\n" +
            "        <p>Hello, world</p>\n" +
            "    </body>\n" +
            "</html>\n");
    }
复制代码

 

重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO

六、JDK14新特性

1、instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量;

复制代码
/**
     * JDK14 instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量;
     * @author Yasin Liu
     * @date 2023/6/1
     * @return: void
     **/
    @Test
    public void testInstanceof() {
        Object obj = new String("123");
        if (obj instanceof String s) {
            System.out.println(s);
        }
    }
复制代码

 

2、引入record类,类似于枚举类型,可以像Lombok一样自动生成构造器、equals、getter等方法;

Java Record 是语言级别的,一种语义特性,为了建模而用,数据聚合。简单说就是提供了通用的数据类,充当“数据
载体",用于在类和应用程序之间进行数据传输。
 
public record TestRecord(Car car, Cat cat, Dog dog) {
}

3、NullPointerException打印优化,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;

七、JDK15新特性(2020年9月)

1、隐藏类 hidden class;

2、密封类 sealed class,通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用;

复制代码
sealed class A {} // 密封类,必须被继承

final class A_1 extends A { } // 密封类的子类可以是final、sealed或non-sealed(即普通类)

non-sealed class A_2 extends A { }

sealed class A_3 extends A permits A_3_1, A_3_2 { } // 密封类可以指定只能哪些子类可以继承它

non-sealed class A_3_1 extends A_3 { }

final class A_3_2 extends A_3 { }

// non-sealed class A_3_3 extends A_3 {} // 没有指定该类继承A_3
复制代码

 

八、JDK16新特性(2021年3月)

1、ZGC性能优化

2、instanceof模式匹配

3、record的引入

JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入

九、JDK17新特性(2021年9月)(LTS版本)

 1、正式引入密封类sealed class,限制抽象类的实现;

2、统一日志异步刷新,先将日志写入缓存,然后再异步刷新;

虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善

posted @   爱喝茶的猫先生  阅读(517)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示