小林coding面试题笔记(五)

异常

1. Java异常的介绍

Java异常体系主要基于两大类:Throwable类及其子类。Throwable有两个重要的子类:ErrorException,它们分别代表了不同类型的异常情况。

1.1 Error(错误)

  • 表示运行时环境的错误,通常是程序无法处理的严重问题。
  • 示例:
    • OutOfMemoryError
    • StackOverflowError

1.2 Exception(异常)

  • 表示程序本身可以处理的异常条件。
  • 分类:
    • 非运行时异常:在编译时期必须被捕获或声明抛出,例如:
      • FileNotFoundException
      • ClassNotFoundException
    • 运行时异常:由程序错误导致,例如:
      • NullPointerException
      • ArrayIndexOutOfBoundsException

2. Java异常处理方式

2.1 try-catch语句块

用于捕获并处理可能抛出的异常。

1
2
3
4
5
6
7
8
9
try {
// 可能抛出异常的代码
} catch (ExceptionType1 e1) {
// 处理异常类型1的逻辑
} catch (ExceptionType2 e2) {
// 处理异常类型2的逻辑
} finally {
// 可选的finally块,用于定义无论是否发生异常都会执行的代码
}

2.2 throw语句

用于手动抛出异常。

1
throw new ExceptionType("Exception message");

2.3 throws关键字

用于在方法声明中声明可能抛出的异常类型。

1
2
3
public void methodName() throws ExceptionType {
// 方法体
}

2.4 finally块

无论是否发生异常,都会执行的代码块,通常用于释放资源。

1
2
3
4
5
6
7
try {
// 可能抛出异常的代码
} catch (ExceptionType e) {
// 处理异常的逻辑
} finally {
// 无论是否发生异常,都会执行的代码
}

3. 常见问题

3.1 为什么有时不需要throws?

  • 未检查异常:如RuntimeException,编译器不强制要求处理。
  • 内部捕获和处理:如果方法内部已经捕获并处理了异常,则无需使用throws

3.2 try-catch中的语句运行情况

  • try块中的代码按顺序执行。
  • 如果抛出异常,进入匹配的catch块处理。
  • 如果没有匹配的catch块,异常会向上传递。

3.3 try{return “a”} finally{return “b”}返回什么?

  • 返回"b",因为finally块中的return会覆盖try块中的return

Java基础

1. == 与 equals 的区别

1.1 对于字符串

  • ==:比较内存地址。
  • equals:比较字符串内容。

1.2 对于非字符串

  • 如果未重写equals方法,==equals作用相同,比较内存地址。

2. hashCode 和 equals 的关系

  • 一致性:如果obj1.equals(obj2)true,则obj1.hashCode()必须等于obj2.hashCode()
  • 非一致性:如果obj1.hashCode()等于obj2.hashCode()obj1.equals(obj2)不一定为true

3. String、StringBuffer、StringBuilder 的区别

特性StringStringBuilderStringBuffer
不可变性不可变可变可变
线程安全性是(因不可变)是(同步方法)
性能高(单线程)中(多线程)
使用场景静态字符串单线程动态字符串多线程动态字符串

示例代码

1
2
3
4
5
6
7
8
9
10
11
// String的不可变性
String str = "abc";
str = str + "def"; // 新建对象,str指向新对象

// StringBuilder(单线程高效)
StringBuilder sb = new StringBuilder();
sb.append("abc").append("def");

// StringBuffer(多线程安全)
StringBuffer sbf = new StringBuffer();
sbf.append("abc").append("def");

Java新特性

1. Java 8 新特性

特性名称描述示例或说明
Lambda 表达式简化匿名内部类,支持函数式编程(a, b) -> a + b
函数式接口仅含一个抽象方法的接口@FunctionalInterface
Stream API提供链式操作处理集合数据,支持并行处理list.stream().filter(x -> x > 0)
Optional 类封装可能为 null 的对象,减少空指针异常Optional.ofNullable(value).orElse("default")
方法引用简化 Lambda 表达式,直接引用现有方法System.out::println
接口的默认方法接口可定义默认实现和静态方法interface A { default void print(); }

2. Java 21 新特性

2.1 新语言特性

  • Switch语句的模式匹配:支持更灵活的类型检查。
  • 字符串模板:简化字符串拼接。

2.2 并发特性

  • 虚拟线程:轻量级线程,提升并发性能。
  • Scoped Values:在线程间共享不可变数据的新方式。

设计模式

1. 单例模式(双重检查锁定)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SingleTon {
private static volatile SingleTon instance = null;

private SingleTon() {}

public static SingleTon getInstance() {
if (instance == null) {
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();
}
}
}
return instance;
}
}

I/O

1. BIO、NIO、AIO 的区别

特性BIO(阻塞IO)NIO(非阻塞IO)AIO(异步IO)
模型阻塞非阻塞异步
线程模型每连接一线程单线程处理多连接回调机制
性能更高

其他

1. 按分数和学号排序

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Student implements Comparable<Student> {
private int id;
private int score;

@Override
public int compareTo(Student other) {
if (this.score != other.score) {
return Integer.compare(other.score, this.score); // 分数降序
} else {
return Integer.compare(this.id, other.id); // 学号升序
}
}
}
1
2
List<Student> students = new ArrayList<>();
Collections.sort(students);