后端面试题
Java 面试题
1. Java 内存模型(JMM)是什么?
Java 内存模型定义了线程如何与内存交互,包括:
- 主内存:存储共享变量
- 工作内存:线程私有的内存空间
- 内存屏障:保证内存操作的可见性和有序性
2. 什么是 Java 垃圾回收机制?
Java 的垃圾回收机制包括:
- 标记-清除算法
- 复制算法
- 标记-整理算法
- 分代收集算法
垃圾收集器:
- Serial GC
- Parallel GC
- CMS GC
- G1 GC
3. 什么是 Java 并发编程?
Java 并发编程的核心:
- 线程创建和生命周期
- 线程同步(synchronized, volatile)
- 线程通信(wait/notify)
- 并发工具类(CountDownLatch, CyclicBarrier)
- 线程池(ThreadPoolExecutor)
Python 面试题
1. Python 的 GIL 是什么?
GIL(Global Interpreter Lock)是 Python 解释器的全局锁,它确保同一时间只有一个线程执行 Python 字节码。
影响:
- 多线程程序在 CPU 密集型任务中性能受限
- I/O 密集型任务不受影响
- 多进程可以绕过 GIL 限制
2. Python 的装饰器是什么?
装饰器是 Python 的一种语法糖,用于修改或增强函数的功能。
python
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Before function call")
result = func(*args, **kwargs)
print("After function call")
return result
return wrapper
@my_decorator
def my_function():
print("Inside function")3. Python 的生成器是什么?
生成器是一种特殊的迭代器,使用 yield 关键字实现。
python
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b数据库面试题
1. 数据库索引是什么?有什么优缺点?
索引是数据库中用于加速查询的数据结构。
优点:
- 加快查询速度
- 保证数据唯一性
- 加速表连接
缺点:
- 占用存储空间
- 降低写入速度
- 需要维护
2. 什么是数据库事务?
事务是数据库操作的原子单位,具有 ACID 特性:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
3. 数据库的隔离级别有哪些?
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
微服务面试题
1. 什么是微服务架构?
微服务架构是一种将应用程序拆分为多个小型、独立服务的架构风格。
特点:
- 服务独立部署
- 技术栈灵活
- 可扩展性强
- 容错性好
2. 微服务通信方式有哪些?
- REST API
- gRPC
- 消息队列(RabbitMQ, Kafka)
- GraphQL
3. 微服务治理包含哪些内容?
- 服务注册与发现
- 负载均衡
- 熔断降级
- 限流
- 监控告警
- 链路追踪
系统设计面试题
1. 如何设计一个高并发系统?
- 使用缓存(Redis, Memcached)
- 数据库优化(读写分离, 分库分表)
- 消息队列削峰
- CDN 加速
- 负载均衡
2. 如何设计一个分布式系统?
- 一致性哈希
- CAP 理论
- 分布式事务
- 分布式锁
- 分布式 ID
3. 如何保证系统的高可用?
- 多机房部署
- 故障转移
- 限流降级
- 监控告警
- 灰度发布
实践案例
1. 实现一个简单的线程池
java
public class SimpleThreadPool {
private BlockingQueue<Runnable> taskQueue;
private List<WorkerThread> threads;
public SimpleThreadPool(int poolSize) {
taskQueue = new LinkedBlockingQueue<>();
threads = new ArrayList<>();
for (int i = 0; i < poolSize; i++) {
WorkerThread worker = new WorkerThread();
worker.start();
threads.add(worker);
}
}
public void execute(Runnable task) {
taskQueue.offer(task);
}
private class WorkerThread extends Thread {
@Override
public void run() {
while (true) {
try {
Runnable task = taskQueue.take();
task.run();
} catch (InterruptedException e) {
break;
}
}
}
}
}2. 实现一个简单的缓存系统
python
class LRUCache:
def __init__(self, capacity):
self.capacity = capacity
self.cache = {}
self.order = []
def get(self, key):
if key in self.cache:
self.order.remove(key)
self.order.append(key)
return self.cache[key]
return -1
def put(self, key, value):
if key in self.cache:
self.order.remove(key)
elif len(self.cache) >= self.capacity:
oldest = self.order.pop(0)
del self.cache[oldest]
self.cache[key] = value
self.order.append(key)学习资源
在线教程
- Java 官方文档
- Python 官方文档
- MySQL 官方文档
- Redis 官方文档
- Spring 官方文档
书籍推荐
- 《Java 并发编程实战》
- 《Python 核心编程》
- 《高性能 MySQL》
- 《Redis 设计与实现》
- 《微服务设计》
练习平台
- LeetCode
- HackerRank
- CodeSignal
- Codewars