Java 面试知识整理(一):Java 基础
MVC 分别代表什么
| 字母 | 全称 | 含义 | 职责 |
|---|---|---|---|
| M | Model | 模型 | 数据 + 业务逻辑(Service、DAO、Entity) |
| V | View | 视图 | 页面展示(HTML、JSP、Vue) |
| C | Controller | 控制器 | 接收请求、调用 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); // 加钱
// 如果上面任何一步失败,全部回滚
}