面试题目
Java 基础
- Java 的四大特性有哪些?详细讲一下你对多态的理解。
- **重载(Overload)和重写(Override)**的区别是什么?
- **堆(Heap)和栈(Stack)**的区别是什么?
- 在 Java 的五大内存区域中,常量存储在哪里?类的定义存储在哪里?
多线程
- 进程和线程的区别是什么?
- 创建线程有哪几种方式?
- 线程池是如何创建线程的?
- 讲一下对多线程的理解。
数据库
- 讲一下对聚簇索引的理解。
- 数据库事务的四大特性(ACID)有哪些?重点讲一下对原子性和隔离性的理解。
Git
- 克隆 Git 远程仓库的命令是什么?如何创建一个新分支?
参考解析
1. Java 四大特性 & 多态
- 四大特性:封装、继承、多态、抽象。
- 多态:同一方法调用,因对象实际类型不同而表现出不同行为。分为编译时多态(方法重载)和运行时多态(方法重写 + 父类引用指向子类对象)。
- 实现运行时多态的三要素:继承、重写、父类引用指向子类对象(向上转型)。
2. 重载 vs 重写
| 重载 Overload | 重写 Override |
|---|
| 发生位置 | 同一个类 | 子类与父类之间 |
| 方法名 | 相同 | 相同 |
| 参数列表 | 必须不同 | 必须相同 |
| 返回值 | 可不同 | 必须兼容(协变) |
| 多态类型 | 编译时多态 | 运行时多态 |
3. 堆 vs 栈
- 栈:线程私有,存储局部变量、方法调用帧,自动管理,速度快,空间较小。
- 堆:线程共享,存储对象实例和数组,由 GC 管理,空间大但访问相对慢。
4. JVM 五大内存区域
- 五大区域:堆、虚拟机栈、本地方法栈、方法区(元空间)、程序计数器。
- 字符串常量池:JDK 7 起移至堆中;运行时常量池位于方法区(元空间)。
- 类的定义(Class 元数据):存储在**方法区(Metaspace)**中。
5. 进程 vs 线程
- 进程是资源分配的最小单位,线程是 CPU 调度的最小单位。
- 同一进程的线程共享堆、方法区等资源,但各自拥有独立的栈和程序计数器。
- 线程切换开销小于进程切换。
6. 创建线程的方式
- 继承
Thread 类,重写 run()。
- 实现
Runnable 接口,传入 Thread。
- 实现
Callable 接口 + FutureTask,可获取返回值。
- 使用线程池(
ExecutorService)提交任务(推荐)。
7. 线程池创建线程的流程
- 提交任务时,若当前线程数 <
corePoolSize,创建新核心线程执行。
- 若 >=
corePoolSize,任务进入工作队列等待。
- 队列满且线程数 <
maximumPoolSize,创建非核心线程。
- 线程数达到上限且队列满,执行拒绝策略。
8. 聚簇索引
- 聚簇索引(Clustered Index)将数据行与索引存储在一起,叶子节点直接存放完整行数据。
- InnoDB 默认以主键作为聚簇索引;每张表只能有一个聚簇索引。
- 非聚簇索引(二级索引)叶子节点存储主键值,查询时需回表再查聚簇索引。
9. 数据库事务 ACID
- 原子性(Atomicity):事务内所有操作要么全部成功,要么全部回滚,不可部分提交。由 Undo Log 实现。
- 隔离性(Isolation):并发事务之间互不干扰。通过锁机制和 MVCC 实现,隔离级别由低到高:读未提交 → 读已提交 → 可重复读(InnoDB 默认) → 串行化。
10. Git 常用命令
# 克隆远程仓库
git clone <remote-url>
# 创建新分支
git branch <branch-name>
# 创建并切换到新分支(推荐)
git checkout -b <branch-name>
# 或(Git 2.23+)
git switch -c <branch-name>