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