Java中级开发必背面试题(一)
一、Java基础核心
- 1. 面向对象特性
o 封装:隐藏对象内部细节(如私有属性),通过公有方法操作数据。例如用private限制字段访问,提供getter/setter方法。
o 继承:子类复用父类属性和方法(extends关键字),但Java不支持多继承,可通过接口实现。
o 多态:同一方法在不同对象中有不同实现,如方法重写(子类覆盖父类方法)和接口实现。
o 常见问题:重载(Overload)与重写(Override)区别?抽象类与接口的应用场景? - 2. 集合框架
o List:ArrayList基于动态数组实现,查询快但增删慢;LinkedList基于双向链表,增删快但查询慢。
o Map:
o HashMap:非线程安全,允许null键值,通过链表+红黑树解决哈希冲突。
o ConcurrentHashMap:分段锁(JDK7)或CAS+synchronized(JDK8)实现线程安全。
o 常见问题:HashMap扩容机制?HashTable与ConcurrentHashMap区别? - 3. 多线程与并发
o 线程创建:继承Thread类或实现Runnable接口,后者更灵活(可避免单继承限制)。
o 线程安全:
o synchronized:锁对象或方法,保证原子性但可能引发阻塞。
o volatile:保证可见性,但不保证原子性(如计数需配合CAS)。
o 线程池:通过ThreadPoolExecutor配置核心线程数、队列类型等,避免频繁创建线程的开销。
o 常见问题:线程生命周期状态?死锁的四个必要条件?
二、JVM与内存管理
- 1. 内存结构
o 堆:存放对象实例,分为新生代(Eden、Survivor区)和老年代。
o 方法区:存储类信息、常量池(JDK8后由元空间实现)。
o 栈:存放方法调用的局部变量和操作数栈。 - 2. 垃圾回收
o GC算法:标记-清除(内存碎片)、复制算法(年轻代)、标记-整理(老年代)。
o GC Roots:包括虚拟机栈引用的对象、静态变量、常量等。 - 3. 类加载机制
o 双亲委派模型:类加载请求先由父类加载器处理,避免重复加载(如自定义String类无法覆盖JDK的)。
o 加载过程:加载→验证→准备→解析→初始化。 - 4. 常见问题:
o OOM(内存溢出)如何排查?
o 强引用、软引用、弱引用、虚引用的区别?
三、数据库与SQL优化
- 1. 事务与隔离级别
o ACID特性:原子性、一致性、隔离性、持久性。
o 隔离级别:读未提交→读已提交→可重复读→串行化(MySQL默认可重复读)。 - 2. 索引优化
o B+树索引:适合范围查询,InnoDB引擎的聚簇索引按主键顺序存储数据。
o 覆盖索引:查询字段全部在索引中,避免回表操作。 - 3. 分库分表
o 水平分表:按时间或哈希将数据拆分到多张表(如订单表按月拆分)。
o Sharding策略:一致性哈希算法减少数据迁移影响。 - 4. 常见问题:
o SQL执行慢如何排查?(EXPLAIN分析执行计划)
o MyBatis中#{}与${}的区别?
四、框架与设计模式
- 1. Spring框架
o IoC容器:通过XML或注解管理Bean的生命周期和依赖注入(如@Autowired)。
o AOP原理:动态代理(JDK Proxy或CGLIB)实现日志、事务等横切关注点。 - 2. 设计模式
o 单例模式:双重检查锁实现线程安全(需加volatile防止指令重排序)。
o 工厂模式:通过Factory类解耦对象创建(如Spring的BeanFactory)。 - 3. 常见问题:
o Spring事务传播行为有哪些?(如REQUIRED、REQUIRES_NEW)
o MyBatis一级缓存和二级缓存的区别?
五、分布式与微服务
- 1. 分布式锁
o Redis实现:通过SETNX命令和超时机制防止死锁。
o Zookeeper实现:基于临时有序节点监听机制。 - 2. 消息队列
o 消息重复消费:通过幂等性设计(如数据库唯一索引)或业务状态判断解决。 - 3. 常见问题:
o CAP理论如何理解?(一致性、可用性、分区容忍性三选二)
o 服务熔断与降级的区别?
六、项目经验与系统设计
- 1. 项目描述
o STAR法则:描述项目背景(Situation)、任务(Task)、行动(Action)、结果(Result)。
o 技术亮点:如使用线程池优化接口响应时间、通过Redis缓存降低数据库压力。 - 2. 系统设计
o 高并发设计:限流(令牌桶算法)、降级(返回默认数据)、异步处理(消息队列)。 - 3. 常见问题:
o 如何设计一个秒杀系统?
o 遇到过的技术难点及解决方案?