JDK各版本重要变革

JDK各版本重要变革_第1张图片 各版本更新详情

JDK8(LTS)--2014/3

语法层面

lambda表达式(重要特色之一)

  • 一种特殊的匿名内部类,语法更加简洁
  • 允许把函数作为一个方法的参数,将代码象数据一样传递,即将函数作为方法参数传递
  • 基本语法: <函数式接口> <变量名> = (参数...) -> { 方法体}
    • 函数式接口: 接口中只有一个抽象方法
    • @FuntionalInterface:标志接口,保证该接口只能声明一个抽象方法
    • (参数...): 抽象方法的参数
    • ->: 分隔符
    • {}: 抽象方法的实现
    • 如果(参数...)参数为空,只需保留()
    • 如果(参数...)参数只有一个,()可以省略,只需要参数名称即可
    • 如果方法体中执行语句只有一句,且无返回值则可省略{};若有返回值且要省略{},则必须保证执行语句只有一句且省略return
  • Lambda表达式使用的限制条件
    • 方法参数或者局部变量类型必须为接口
    • 接口中只有一个抽象方法
  • Lambda表达式和匿名内部类区别
    • Lambda表达式是针对接口使用的,且接口中只有一个方法;而匿名内部类的类型可以是类、接口等,且接口方法数量是一个或多个
    • Lambda表达式是程序运行过程中生成的类,而匿名内部类则是在编译期生成class文件
       

接口增强

增加了默认方法和静态方法,都是为了接口扩展
默认方法default

  • 在增加该默认方法前一旦在接口中新增方法,则实现该接口的所有类必须实现该方法,不利于接口扩展
  • 有了默认方法,子类就不需要必须重写接口中的方法,需要使用默认方法时,可以通过实现类实例直接调用或者实现类重写后调用

静态方法

  • 接口中的静态方法不能被子类重写,只能通过接口名称调用

函数式接口

Lambda表达式的前提是需要有函数式接口。而Lambda使用时不关心接口名,抽象方法名,只关心抽 象方法的参数列表和返回值类型;java.util.function包下提供了很多函数式接口,如Consumer、Supplier、Function、Predicated

JDK各版本重要变革_第2张图片

方法引用

双冒号::表示引用,方法引用也是为了解决lambda表达式冗余问题;即适合于当lambda表达式中的方法体中引用已经存在的方法

JDK各版本重要变革_第3张图片

API层面

Stream流(常用)

  • Stream流是Java8中处理集合的关键抽象概念,它可以比较高效对集合进行非常复杂的查找、过滤、筛选等操作
  • Stream流不是一种数据结构,不会存储数据,而是对数据进行加工处理后返回

Stream流对象获取

JDK各版本重要变革_第4张图片

Stream流中项目常用的API 

JDK各版本重要变革_第5张图片

Optional类

空指针异常是导致Java应用程序失败的最常见原因。而Java8类库引入的Optional类就是来检查空值防止代码污染,再不用显式进行空值检测,同时代码看起来简洁优雅.常见Optional类API如下:

  • 创建Optional类对象的方法
    • Optional.of(T t) : 创建一个 Optional 实例,t必须非空
    • Optional.empty() : 创建一个空的 Optional 实例
    • Optional.ofNullable(T t):t可以为null
  • 判断Optional容器中是否包含对象
    • boolean isPresent() : 判断是否包含对象
    • void ifPresent(Consumer consumer) :如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它
  • 获取Optional容器的对象:
    • T get(): 如果调用对象包含值,返回该值,否则抛异常
    • T orElse(T other) :如果有值则将其返回,否则返回指定的other对象
    • T orElseGet(Supplier other) :如果有值则将其返回,否则返回由Supplier接口实现提供的对象
    • T orElseThrow(Supplier exceptionSupplier) :如果有值则将其返回,否则抛出由Supplier接口实现提供的异常

日期时间类

  • JDK8前日期类存在的问题
    • 旧日期时间设计混乱: Date日期在util和sql包下都存在,时间转换相关方法又在text包下
    • 线程不安全
  • 新增日期相关类
    • LocalDate: 表示日期类。yyyy-MM-dd
    • LocalTime: 表示时间类。 HH:mm:ss
    • LocalDateTime: 表示日期时间类 yyyy-MM-dd t HH:mm:ss sss
    • DatetimeFormatter:日期时间格式转换类
    • Instant: 时间戳类
    • Duration: 用于计算两个日期类

GC层面

  • JDK8前的永久代被元空间取代,内存改变为本地直接内存
  • JDK8中默认开启的是ParallelGC,即新生代采用Parallel Scavenge,老年代采用parallel Old GC
  • 在JDK9中,将CMS GC标识为废弃,取而代之默认的GC是G1

JDK11(LTS)--2018/9

  • 在JDK9中,将CMS GC标识为废弃,取而代之默认的GC是G1
  • ZGC:可伸缩低延迟垃圾收集器。ZGC 可以看作是 G1 之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化。在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为“Stop the world”。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)
  • Flight Recorder(飞行记录器),基于 OS、JVM 和 JDK 的事件产生的数据收集框架
  • 对Stream、Optional、集合 API 进行增强

JDK17(LTS)--2021/9

  • 在JDK14中,删除 CMS 垃圾回收器
  • Spring 6 和 SpringBoot 3 的最低依赖就是JDK17
  • 正式引入密封类 sealed class,限制抽象类的实现
  • 统一日志异步刷新,先将日志写入缓存,然后再异步刷新

你可能感兴趣的:(#,Java,jdk,java)