JDK8-JDK17新特性一览

发布时间 2023-06-01 16:34:26作者: 爱喝茶的猫先生

官方文档: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

三、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安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程

四、JDK11新特性

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

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

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

/**
     * 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新特性