公司动态

Java面试核心知识点:多线程、集合框架与Spring原理详解

📅 2026/8/23 19:57:06
Java面试核心知识点:多线程、集合框架与Spring原理详解
1. Java面试实战严肃面试官与幽默程序员的精彩对决最近参加了一场互联网大厂的Java面试整个过程既紧张又有趣。面试官是一位严肃的技术专家而我则试图用轻松幽默的方式回答问题。这场面试涵盖了Java基础、多线程并发、框架原理等核心知识点现在将完整过程整理出来希望能给准备面试的朋友们一些参考。2. 第一轮Java基础考察2.1 面向对象特性解析面试官开门见山我们先聊聊Java基础说说Java中的面向对象特性是什么我回答这个我知道面向对象有封装、继承、多态我最喜欢多态因为它可以让一个对象有很多面孔。技术细节补充封装将数据和行为包装在类中通过访问修饰符控制可见性。例如public class Person { private String name; // 封装私有字段 public String getName() { // 提供公共访问方法 return name; } }继承子类继承父类的属性和方法实现代码复用。Java使用extends关键字class Animal { void eat() {...} } class Dog extends Animal {...} // Dog继承Animal多态同一方法在不同子类中有不同实现主要通过方法重写和接口实现Animal myDog new Dog(); // 父类引用指向子类对象 myDog.eat(); // 实际调用Dog类的eat方法注意多态的实现依赖于后期绑定Late BindingJVM在运行时才确定调用哪个具体方法。2.2 ArrayList与LinkedList深度对比面试官接着问不错。那你说说ArrayList和LinkedList的区别我回答ArrayList是用数组实现的访问速度快LinkedList用链表实现增删元素快我觉得链表更帅气深入分析特性ArrayListLinkedList底层结构动态数组双向链表随机访问时间复杂度O(1)O(n)插入/删除时间复杂度尾部O(1)其他位置O(n)头尾O(1)其他位置O(n)内存占用更紧凑连续内存更高每个元素需要额外指针空间适用场景频繁随机访问频繁插入删除实际应用建议查询多、修改少用ArrayList频繁在中间位置插入删除用LinkedList不确定时优先选择ArrayList现代CPU缓存对数组更友好2.3 HashMap线程安全问题解决方案面试官继续追问还行那HashMap的线程安全问题是怎么解决的我犹豫了一下呃...加个锁或者用ConcurrentHashMap原理详解问题根源HashMap在扩容时可能形成环形链表导致CPU 100%解决方案对比Collections.synchronizedMapMapString, String syncMap Collections.synchronizedMap(new HashMap());原理对整个Map加锁优点实现简单缺点性能差全表锁ConcurrentHashMapConcurrentHashMapString, String concurrentMap new ConcurrentHashMap();原理分段锁JDK7或CASsynchronizedJDK8优点高并发性能好缺点实现复杂实战经验JDK8后的ConcurrentHashMap使用NodeCASsynchronized锁粒度更细性能更好。在putVal方法中可以看到精妙的并发控制实现。3. 第二轮多线程与并发3.1 线程池的妙用面试官转换话题那我们聊聊多线程线程池你用过吗说说它的好处。我回答线程池可以重用线程节省资源。还有四种线程池类型固定大小的、缓存的、单线程的还有一个是...我忘了。完整解析线程池的真正价值降低资源消耗避免频繁创建销毁线程提高响应速度任务到达时直接执行提供管理能力可以限制并发数量等四种线程池类型详解FixedThreadPoolExecutorService fixedPool Executors.newFixedThreadPool(5);特点固定线程数适用负载较重的服务器CachedThreadPoolExecutorService cachedPool Executors.newCachedThreadPool();特点线程数无限制空闲线程60秒回收适用短期异步任务SingleThreadExecutorExecutorService singlePool Executors.newSingleThreadExecutor();特点单线程顺序执行适用需要顺序执行的任务ScheduledThreadPoolScheduledExecutorService scheduledPool Executors.newScheduledThreadPool(3);特点可定时/周期性执行适用定时任务避坑指南不要使用Executors创建线程池容易OOM推荐手动创建ThreadPoolExecutor明确指定参数new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);3.2 CountDownLatch与CyclicBarrier对比面试官追问说说JUC包里的CountDownLatch和CyclicBarrier的区别我答道CountDownLatch是个倒计时器CyclicBarrier是个栅栏...深度对比特性CountDownLatchCyclicBarrier初始化指定计数指定参与线程数计数方式递减不可重置递增可重置等待机制线程等待计数归零线程互相等待重用性一次性可重复使用异常处理无特殊机制提供屏障动作异常处理典型应用场景CountDownLatch主线程等待多个子任务完成CountDownLatch latch new CountDownLatch(3); // 子线程完成任务后调用latch.countDown() latch.await(); // 主线程等待CyclicBarrier并行计算多阶段任务CyclicBarrier barrier new CyclicBarrier(3, () - { // 所有线程到达后执行 }); // 线程调用barrier.await()等待3.3 ReentrantLock与synchronized终极对决面试官继续那ReentrantLock和synchronized呢我支支吾吾锁和...呃...加锁全面对比基本特性synchronizedJVM内置锁自动释放ReentrantLockAPI层面的锁需要手动释放高级功能公平锁ReentrantLock可配置公平性条件变量ReentrantLock支持多个Condition可中断ReentrantLock支持lockInterruptibly()超时机制ReentrantLock支持tryLock(timeout)性能JDK6后两者性能接近低竞争时synchronized有优势高竞争时ReentrantLock更灵活代码示例// synchronized方式 public synchronized void syncMethod() { // 临界区 } // ReentrantLock方式 private final ReentrantLock lock new ReentrantLock(); public void lockMethod() { lock.lock(); try { // 临界区 } finally { lock.unlock(); } }经验之谈除非需要高级功能否则优先使用synchronized。JDK8后synchronized性能已经大幅优化。4. 第三轮框架与中间件4.1 Spring AOP实战解析面试官转向框架Spring里的AOP你用过吗我回答AOP啊面向切面编程嘛用来干嘛的...日志AOP核心概念切面Aspect横切关注点的模块化连接点Joinpoint程序执行点如方法调用通知Advice在连接点执行的动作切点Pointcut匹配连接点的表达式五种通知类型Before方法执行前AfterReturning方法正常返回后AfterThrowing方法抛出异常后After方法执行后无论结果Around环绕通知最强大典型应用场景日志记录事务管理权限控制性能监控异常处理配置示例Aspect Component public class LoggingAspect { Before(execution(* com.example.service.*.*(..))) public void logBefore(JoinPoint joinPoint) { System.out.println(准备执行: joinPoint.getSignature()); } }4.2 SpringBoot自动配置原理面试官继续那SpringBoot的自动配置原理了解吗我答道自动配置就是Spring帮你把东西都配好省事深入原理启动流程SpringBootApplication组合了三个核心注解SpringBootConfigurationEnableAutoConfigurationComponentScan自动配置关键spring.factories文件定义自动配置类Conditional系列注解控制条件装配通过EnableAutoConfiguration触发加载自定义starter步骤创建autoconfigure模块编写配置类带Configuration添加META-INF/spring.factories定义条件注解调试技巧启动时添加--debug参数查看自动配置报告使用ConditionalOnProperty控制配置开关通过AutoConfigureAfter指定加载顺序4.3 MyBatis缓存机制详解最后面试官问MyBatis的一级缓存和二级缓存区别是什么我快速回答一级缓存是本地的二级缓存是共享的嗯就是这样缓存机制对比特性一级缓存二级缓存作用范围SqlSession级别Mapper级别跨SqlSession默认状态开启需要手动配置存储位置内存可配置Redis等外部缓存失效策略执行update/commit/close时清空配置的刷新间隔或手动清空线程安全不安全单个SqlSession内使用需要缓存实现保证安全配置示例!-- 开启二级缓存 -- settings setting namecacheEnabled valuetrue/ /settings !-- Mapper中配置 -- mapper namespacecom.example.UserMapper cache evictionLRU flushInterval60000/ /mapper性能优化建议频繁查询但很少修改的数据适合缓存注意缓存击穿问题使用互斥锁考虑使用Redis等分布式缓存监控缓存命中率调整策略5. 面试总结与建议经历了这场面试我深刻体会到技术深度和表达方式同样重要。面试官看似随意的问题实际上是在考察知识体系的完整性和实际应用经验。对于准备Java面试的朋友我有几点建议基础要扎实Java核心API、集合框架、并发编程必须熟练掌握原理要清楚不只是会用更要明白背后的设计思想框架要深入Spring/SpringBoot/MyBatis等主流框架的核心原理要理解表达要清晰能用简洁准确的语言解释复杂概念态度要端正保持谦虚好学的态度不会的问题可以坦诚说明最后提醒一点面试不仅是技术考察也是双向选择的过程。保持自信但不要自负紧张时可以适当幽默但切忌过度。希望这份面试实录对大家有所帮助