Java 面试知识整理(一):Java 基础

MVC 分别代表什么

字母全称含义职责
MModel模型数据 + 业务逻辑(Service、DAO、Entity)
VView视图页面展示(HTML、JSP、Vue)
CController控制器接收请求、调用 Model、返回 View

面试回答(日文):

MVCとは、Model・View・Controllerの略で、アプリケーションを3つの役割に分ける設計パターンです。

  • Model:データとビジネスロジックを担当
  • View:画面表示を担当
  • Controller:リクエストを受け取り、ModelとViewを制御

同步 vs 异步

对比项同步(同期)异步(非同期)
执行方式按顺序执行,等待上一个完成不等待,继续执行后续代码
阻塞会阻塞线程不会阻塞线程
例子普通方法调用CompletableFuture, @Async, 消息队列
适用场景简单操作、必须按顺序IO操作、网络请求、耗时任务

代码对比:

// 同步 - 等待结果
String result = userService.getUser();  // 等3秒
System.out.println(result);             // 3秒后才执行

// 异步 - 不等待
CompletableFuture<String> future = userService.getUserAsync();
System.out.println("先执行这里");  // 立即执行
String result = future.get();     // 需要结果时再等待

DAO 层的作用

DAO = Data Access Object(データアクセスオブジェクト)

  • 负责数据库的 CRUD 操作
  • 将 SQL 语句与业务逻辑分离
  • 通常配合 MyBatis 或 JPA 使用
@Repository  // DAO层注解
public interface UserDao {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(Long id);
}

for 循环跳过本轮循环的关键词

continue — 跳过本轮循环,进入下一次循环

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;  // 跳过偶数,不打印
    }
    System.out.println(i);  // 只打印奇数
}

对比: break 是跳出整个循环,continue 是跳过本轮


异常处理中 finally 的作用

finally — 无论是否发生异常,一定会执行的代码块

try {
    // 业务逻辑
    conn = getConnection();
    // ... 可能抛出异常
} catch (SQLException e) {
    log.error("数据库错误", e);
} finally {
    // 一定会执行:释放资源
    if (conn != null) {
        conn.close();  // 关闭数据库连接
    }
}

典型用途:

  • 关闭文件流、数据库连接、网络连接
  • 释放锁资源
  • 清理临时文件

Session 是什么

Session(セッション) — 服务器端保存的用户会话信息

用户登录 → 服务器创建 Session → 返回 Session ID(存在 Cookie)
后续请求 → 携带 Session ID → 服务器识别用户身份

特点:

  • 数据存在服务器端
  • 每个用户有唯一的 Session ID
  • 有有效期(超时自动销毁)
  • 常用于:登录状态、购物车、验证码

Transaction(事务)是什么

Transaction(トランザクション) — 一组操作,要么全部成功,要么全部回滚

ACID 四大特性:

特性含义例子
Atomicity(原子性)不可分割转账:扣钱+加钱,必须都成功
Consistency(一致性)数据一致总金额不变
Isolation(隔离性)互不干扰并发操作不混乱
Durability(持久性)一旦提交就永久保存重启不丢失
@Transactional  // Spring 声明式事务
public void transfer(Long fromId, Long toId, BigDecimal amount) {
    accountMapper.deduct(fromId, amount);   // 扣钱
    accountMapper.add(toId, amount);        // 加钱
    // 如果上面任何一步失败,全部回滚
}