Java 8 及经典面试题全解析
Java 是目前非常流行的编程语言之一,其强大的生态系统和丰富的功能使得它在企业级开发中占据重要地位。在面试中,Java 的基础知识、集合框架、多线程、JVM,以及 Java 8 的新特性是重点考查内容。本文将结合 Java 8 和经典知识点,为大家梳理高频面试题及其解析。
一、Java 8 新特性面试题
Java 8 是 Java 语言的一个重要版本,新增了许多提高开发效率和代码可读性的功能。以下是 Java 8 常见的高频面试题。
1.1 什么是 Lambda 表达式?其语法和作用是什么?
解析
- 定义:Lambda 表达式是 Java 8 引入的简化匿名内部类的写法,可以将函数作为参数传递。
- 语法:
(参数列表) -> {方法体}
- 作用:简化代码,提高可读性。
示例代码
// 使用匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, Lambda!");
}
};
// 使用 Lambda 表达式
Runnable lambdaRunnable = () -> System.out.println("Hello, Lambda!");
1.2 什么是函数式接口?常见的函数式接口有哪些?
解析
-
定义:函数式接口是只包含一个抽象方法的接口。
-
常见接口
:
Predicate<T>
:接收一个参数,返回布尔值。Function<T, R>
:接收一个参数,返回一个结果。Consumer<T>
:接收一个参数,没有返回值。Supplier<T>
:不接收参数,返回一个结果。
示例代码
// Predicate 示例
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
// Function 示例
Function<String, Integer> stringLength = s -> s.length();
System.out.println(stringLength.apply("Java")); // 4
1.3 什么是 Stream API?有哪些常见操作?
解析
-
定义:Stream 是用于操作集合的强大工具,支持链式操作。
-
常见操作
:
- 中间操作:如
filter
、map
、sorted
。 - 终端操作:如
forEach
、collect
、reduce
。
- 中间操作:如
示例代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 过滤偶数并求平方
numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.forEach(System.out::println); // 输出 4, 16
1.4 什么是 Optional 类?如何使用?
解析
Optional
是一个容器类,用来避免 NullPointerException
。
示例代码
Optional<String> optional = Optional.ofNullable(null);
// 如果值存在则打印,否则打印默认值
System.out.println(optional.orElse("Default Value"));
// 如果值存在则执行操作
optional.ifPresent(value -> System.out.println("Value: " + value));
1.5 什么是默认方法?为什么要引入?
解析
默认方法是接口中的一种方法,可以提供默认实现,解决接口向后兼容的问题。
示例代码
interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
public class DefaultMethodExample implements MyInterface {
public static void main(String[] args) {
new DefaultMethodExample().defaultMethod();
}
}
1.6 Java 8 中的时间 API
示例代码
import java.time.*;
public class DateTimeExample {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("Date: " + date);
System.out.println("Time: " + time);
System.out.println("DateTime: " + dateTime);
}
}
二、Java 经典知识面试题
Java 的基础、集合框架、多线程、JVM 是面试中的长青树,以下是这些模块的高频考点。
2.1 HashMap 的工作原理是什么?
解析
- HashMap 的底层数据结构是数组+链表(Java 8 后为红黑树)。
- 通过
hashCode
和equals
实现键值对的存储和查找。
2.2 ArrayList 和 LinkedList 的区别是什么?
解析
- ArrayList 基于动态数组,适合随机访问。
- LinkedList 基于双向链表,适合频繁插入删除。
2.3 线程的生命周期有哪些状态?
解析
- 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Terminated)。
2.4 如何实现线程安全?
解析
- 使用
synchronized
。 - 使用
java.util.concurrent
包提供的线程安全工具类。
示例代码
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
2.5 JVM 内存模型
解析
JVM 内存分为方法区、堆、栈、程序计数器、本地方法栈。
2.6 常见的垃圾回收算法
解析
- 标记-清除
- 复制算法
- 标记-整理
- 分代收集
2.7 如何分析 JVM 性能问题?
解析
使用工具如 jconsole
、jvisualvm
、jstack
。
三、总结
本文全面梳理了 Java 8 的新特性面试题以及 Java 经典知识模块的高频考点。通过对 Lambda 表达式、Stream API、Optional 类,以及多线程、集合、JVM 等内容的解析,希望能够帮助你在面试中脱颖而出。
后续内容将深入探讨更多高级特性及实践应用,敬请期待!