🕗 Java 新特性

吞佛童子2022年10月10日
  • Java
  • Java 新特性
大约 5 分钟

🕗 Java 新特性

1. Java 8

1) 接口

① 接口添加 默认方法

interface MyInterface{
    // 需要子类实现的方法
    void needOverMethod();

    // 子类可以实现,也可以不实现的默认方法
    default void dMethod() {
        System.out.println("this is a default method");
    }
}
  1. 接口添加 default 方法,子类可以直接使用,也可以重写实现自己的该方法
  2. 若 一个类 实现了 两个接口,这两个接口均含有 同一方法 && 这两个接口没有继承关系,则 子类必须重写该方法,否则会 编译出错

② 函数式接口 & Lambda 表达式

  1. @FunctionalInterface一种信息性注释类型,用于指示接口类型声明旨在成为 Java 语言规范定义的功能接口。
  2. 从概念上讲,函数式接口只有一个抽象方法由于默认方法有一个实现,它们不是抽象的
  3. 如果一个接口声明了一个覆盖 java.lang.Object 的公共方法之一的抽象方法,这也不会计入接口的抽象方法计数,
    • 因为该接口的任何实现都将具有来自 java.lang.Object 或其他地方的实现。
  4. 函数式接口的实例可以使用 lambda 表达式、方法引用或构造函数引用来创建。
  5. 如果使用此注解类型对类型进行注解,编译器 需要生成错误消息,除非该类型是接口类型,而不是注解类型、枚举或类。
  6. 带注释的类型满足功能接口的要求。但是,无论接口声明中是否存在 FunctionalInterface 注释,编译器都会将满足功能接口定义的任何接口视为功能接口。

2) Stream

  1. 方法参数都是 函数式接口 类型
  2. 一个 Stream 只能操作一次,一次可拼接多个条件
  3. Stream 不保存数据,不改变数据源

3) 日期类

  1. 新增 3 个日期类
    • img_1.png
  2. 简化了 时间的转换 & 时区的相关操作
  3. 避免了 SimpleDateFormat 类带来的 线程不安全 问题
public class Application {
    public static void main(String[] args) {
        mySol2();
    }

    public static void mySol2() {
        LocalDate date = LocalDate.now();
        System.out.println("当前日期 == " + date);
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        System.out.println("今天是周几 == " + dayOfWeek);
        LocalDate nextWeek = date.plusWeeks(1);
        System.out.println("下周日期 == " + nextWeek);
        Period period = Period.between(date, nextWeek);
        System.out.println("今天 和 下周这天之间隔了 " + period.getDays() + " 天");

        LocalTime time = LocalTime.now();
        System.out.println("当前时间 == " + time);

        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("当前日期:当前时间 == " + dateTime);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前日期:当前时间 转换为指定样式 == " + dateTime.format(dateTimeFormatter));
    }
}

当前日期 == 2022-09-15
今天是周几 == THURSDAY
下周日期 == 2022-09-22
今天 和 下周这天之间隔了 7 天
当前时间 == 16:05:20.855
当前日期:当前时间 == 2022-09-15T16:05:20.855
当前日期:当前时间 转换为指定样式 == 2022-09-15 16:05:20

4) Map

HashMap

  1. 由 链表 ==> 链表 + 红黑树
  2. 由 头插法 ==> 尾插法

ConcurrentHashMap

  1. 由 分段锁 (implements ReentrantLock) ==> CAS + Synchronized

5) JUC 下新增相关类

StampedLock

  • 引入 StampedLock 类,在 读写锁 的基础上,添加了 不用 CAS 操作的乐观锁,
    • 首先 无锁生成一个时间戳,然后通过 validate() 函数通过当前状态生成一个新的时间戳,若两次时间戳没有改变,说明期间没有其他线程操作,获锁成功

LongAdder

  • 引入 LongAdder 类,分桶操作,无竞争时,通过 CAS 分桶更新,提高并发度

6) JVM

  1. JDK 1.7 将 方法区的 字符串常量 & 类静态变量 转移到
  2. JDK 1.8 将 方法区的其他部分 -- 已加载的类信息即时编译的代码缓存等,转移到 元空间
    • 废弃 永久代,转而使用 位于本地内存的 元空间,OOM 出现频率有效降低

2. Java 9

1) 接口

  • 接口添加 private 方法

2) 默认垃圾收集器

  • JDK 8 默认垃圾收集器 Parallel Scavenge(新生代)+ Parallel Old(老年代)
  • JDK 9 默认垃圾收集器 G1

3) String 类

  • 元素通过 byte[] 存储,而非原来的 char[],节省内存空间
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou