🕗 Java 新特性
2022年10月10日
- Java
🕗 Java 新特性
1. Java 8
1) 接口
① 接口添加 默认方法
interface MyInterface{
// 需要子类实现的方法
void needOverMethod();
// 子类可以实现,也可以不实现的默认方法
default void dMethod() {
System.out.println("this is a default method");
}
}
- 接口添加
default
方法,子类可以直接使用,也可以重写实现自己的该方法 - 若 一个类 实现了 两个接口,这两个接口均含有 同一方法 && 这两个接口没有继承关系,则 子类必须重写该方法,否则会 编译出错
② 函数式接口 & Lambda 表达式
@FunctionalInterface
一种信息性注释类型,用于指示接口类型声明旨在成为 Java 语言规范定义的功能接口。- 从概念上讲,函数式接口只有一个抽象方法。由于默认方法有一个实现,它们不是抽象的。
- 如果一个接口声明了一个覆盖
java.lang.Object
的公共方法之一的抽象方法,这也不会计入接口的抽象方法计数,- 因为该接口的任何实现都将具有来自 java.lang.Object 或其他地方的实现。
- 函数式接口的实例可以使用
lambda
表达式、方法引用或构造函数引用来创建。 - 如果使用此注解类型对类型进行注解,编译器 需要生成错误消息,除非该类型是接口类型,而不是注解类型、枚举或类。
- 带注释的类型满足功能接口的要求。但是,无论接口声明中是否存在
FunctionalInterface
注释,编译器都会将满足功能接口定义的任何接口视为功能接口。
2) Stream
- 方法参数都是 函数式接口 类型
- 一个 Stream 只能操作一次,一次可拼接多个条件
- Stream 不保存数据,不改变数据源
3) 日期类
- 新增 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
- 由 链表 ==> 链表 + 红黑树
- 由 头插法 ==> 尾插法
ConcurrentHashMap
- 由 分段锁 (implements ReentrantLock) ==> CAS + Synchronized
5) JUC 下新增相关类
StampedLock
- 引入 StampedLock 类,在 读写锁 的基础上,添加了 不用 CAS 操作的乐观锁,
- 首先 无锁生成一个时间戳,然后通过 validate() 函数通过当前状态生成一个新的时间戳,若两次时间戳没有改变,说明期间没有其他线程操作,获锁成功
LongAdder
- 引入 LongAdder 类,分桶操作,无竞争时,通过 CAS 分桶更新,提高并发度
6) JVM
JDK 1.7
将 方法区的 字符串常量 & 类静态变量 转移到 堆 中JDK 1.8
将 方法区的其他部分 -- 已加载的类信息、即时编译的代码缓存等,转移到 元空间 中- 废弃 永久代,转而使用 位于本地内存的 元空间,OOM 出现频率有效降低
2. Java 9
1) 接口
- 接口添加
private
方法
2) 默认垃圾收集器
JDK 8
默认垃圾收集器Parallel Scavenge
(新生代)+Parallel Old
(老年代)JDK 9
默认垃圾收集器G1
3) String 类
- 元素通过
byte[]
存储,而非原来的char[]
,节省内存空间