跳转至

12JDK8 有哪些新特性?

约 677 个字 32 行代码 预计阅读时间 3 分钟

JDK8 较为重要和平日里经常被问的特性如下:

1)用元空间替代了永久代
2)引入了 Lambda 表达式
3)引入了日期类、接口默认方法、静态方法
4)新增 Stream 流式接口
5)引入 Optional 类
6)新增了 CompletableFuture 、StampedLock 等并发实现类。

如果你对 HashMap、ConcurrentHashMap 面试题有准备的话,这时候也可以抛出来,引导面试官来询问。比如:Java 8 修改了 HashMap 和 ConcurrentHashMap 的实现。

元空间替代了永久代

因为 JDK8 要把 JRockit 虚拟机和 Hotspot 虚拟机融合,而 JRockit 没有永久代,所以把 Hotspot 永久代给去了(本质也是永久代回收效率太低)。

详细可看:面试鸭《为什么 Java8 移除了永久代,加了元空间?》 这题。

Lambda 表达式

Lambda 是 Java 8 引入的一种匿名函数,可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。

其本质是作为函数式接口的实例。例如:

// 传统方式
Runnable runnable1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("mianshiya.com");
    }
};

// Lambda 表达式
Runnable runnable2 = () -> System.out.println("mianshiya.com");

日期类

Java 8 引入了新的日期和时间 API(位于 java.time 包中),它们更加简洁和易于使用,解决了旧版日期时间 API 的许多问题。

例如 DateCalendar 都是可变类且线程不安全。而新的日期类都是不可变的,一旦创建就不能修改,这样可以避免意外的修改,提升代码的安全性和可维护性。

LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();

Date 本身不包含时区信息,必须使用 Calendar 类来处理时区,但使用起来非常复杂且容易出错。

新 API 提供了专门的时区类(如 ZonedDateTime, OffsetDateTime, ZoneId 等),简化了时区处理,并且这些类的方法更加直观和易用。

接口默认方法、静态

默认方法允许在接口中定义方法的默认实现,这样接口的实现类不需要再实现这些方法。之所以提供静态方法,是为了将相关的方法内聚在接口中,而不必创建新的对象。

interface MyInterface {
    default void defaultMethod() {
        System.out.println("Default Method");
    }

    static void hello() { 
        System.out.println("Hello, New Static Method Here"); 
    } 
}

Stream 流式接口

Stream API 提供了一种高效且易于使用的方式来处理数据集合。它支持链式操作、惰性求值和并行处理。

List<String> list = Arrays.asList("a", "b", "c", "d");
List<String> result = list.stream()
                          .filter(s -> s.startsWith("a"))
                          .collect(Collectors.toList());

Optional

Optional 类用来解决可能出现的 NullPointerException 问题,提供了一种优雅的方式来处理可能为空的值。

Optional<String> optional = Optional.of("mianshiya.com");
optional.ifPresent(System.out::println);

Optional 详细可查看面试鸭《什么是 Optional 类?》 这题

CompletableFuture

CompletableFuture 提供了一个新的异步编程模型,简化了异步任务的编写和管理。

CompletableFuture.supplyAsync(() -> "Hello")
                 .thenApply(s -> s + " World")
                 .thenAccept(System.out::println);

StampedLock 可查看面试鸭 《StampedLock 用过吗?》 这题。