本人详解
作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》
公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题
中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯
转载说明:务必注明来源(注明:作者:王文峰哦)
【吊打面试官】厦门6年Java开发面试题与答案(技术篇)
学习教程(传送门)
**一、Java基础**
**二、并发编程**
**三、JVM与性能调优**
**四、数据库与优化**
**五、框架与中间件**
**六、分布式与系统设计**
**七、编码与算法**
**八、综合提问**
**总结**
学习教程(传送门)
往期文章
学习教程(传送门)
1、掌握 JAVA入门到进阶知识(持续写作中……)
2、学会Oracle数据库用法(创作中……)
3、手把手教你vbs脚本制作(完善中……)
4、牛逼哄哄的 IDEA编程利器(编写中……)
5、吐血整理的 面试技巧(更新中……)
一、Java基础
HashMap的底层实现原理?JDK1.8后的优化是什么?
答案:
基于数组+链表/红黑树实现,通过哈希算法确定键值对的位置。
JDK1.8后,当链表长度超过8且数组长度≥64时,链表转为红黑树,提升查询效率;哈希冲突时采用尾插法避免死链。
线程不安全,多线程环境下推荐使用ConcurrentHashMap。
Java中volatile关键字的作用?如何保证可见性和有序性?
答案:
保证变量的可见性:修改后立即同步到主内存,其他线程读取时强制刷新本地缓存。
禁止指令重排序:通过内存屏障(Memory Barrier)实现。
不保证原子性(如i++需结合synchronized或AtomicInteger)。
二、并发编程
ReentrantLock和synchronized的区别?
答案:
API层面:ReentrantLock需手动加锁/释放,支持公平锁、可中断、超时等待;synchronized是JVM关键字,自动释放锁。
性能:JDK1.6后synchronized优化后性能接近,高竞争场景下ReentrantLock更灵活。
功能扩展:ReentrantLock可通过Condition实现分组唤醒。
线程池的核心参数和工作流程?拒绝策略有哪些?
答案:
参数:核心线程数、最大线程数、任务队列、线程存活时间、拒绝策略。
流程:任务提交后优先使用核心线程,队列满后创建非核心线程,超过最大线程数触发拒绝策略。
拒绝策略:AbortPolicy(抛异常)、CallerRunsPolicy(调用者线程执行)、DiscardOldestPolicy(丢弃最老任务)、DiscardPolicy(静默丢弃)。
三、JVM与性能调优
如何排查OOM(内存溢出)问题?常见的OOM场景有哪些?
答案:
工具:jmap生成堆转储文件,MAT或VisualVM分析对象占用。
场景:堆内存不足(对象过多)、方法区溢出(动态类生成)、栈溢出(递归过深)、直接内存溢出(NIO未释放)。
调优:调整堆大小(-Xms/-Xmx)、优化代码(避免内存泄漏)、使用弱引用等。
G1垃圾回收器的特点?与CMS的区别?
答案:
G1:面向大堆内存,分区(Region)回收,可预测停顿时间,适合高吞吐和低延迟场景。
CMS:基于标记-清除算法,追求低停顿,但会产生内存碎片,Full GC时可能长时间停顿。
四、数据库与优化
MySQL索引失效的常见场景?如何优化慢查询?
答案:
失效场景:对索引列使用函数、类型隐式转换、!=或<>、OR连接非索引列、最左前缀原则未遵守。
优化:使用EXPLAIN分析执行计划、覆盖索引、避免SELECT *、分库分表、读写分离。
什么是幻读?如何解决?
答案:
幻读:同一事务中多次查询的结果集行数不一致(新增/删除数据)。
解决:使用SELECT ... FOR UPDATE(悲观锁)或MVCC+Next-Key Lock(InnoDB默认通过间隙锁防止幻读)。
五、框架与中间件
Spring如何解决循环依赖?
答案:
通过三级缓存:
singletonFactories(提前暴露未初始化的对象)。
earlySingletonObjects(存放早期对象)。
singletonObjects(完整Bean)。
仅支持单例作用域的Setter/Field注入循环依赖,构造函数注入无法解决。
Redis持久化机制RDB和AOF的区别?如何选择?
答案:
RDB:快照保存,恢复快但可能丢失最后一次快照后的数据。
AOF:记录写命令,数据更安全但文件较大、恢复慢。
选择:高可用场景建议RDB+AOF混合使用(Redis 4.0+)。
六、分布式与系统设计
如何设计一个秒杀系统?核心难点是什么?
答案:
设计要点:
流量削峰:队列缓冲(如Kafka)、限流(令牌桶/漏桶)。
缓存预热:库存数据预加载到Redis。
异步处理:下单与支付解耦。
降级策略:超时后关闭未支付订单。
难点:高并发下的数据一致性、防止超卖(Redis原子操作或分布式锁)。
分布式事务的解决方案有哪些?
答案:
2PC:两阶段提交,强一致性但性能低。
TCC:Try-Confirm-Cancel,业务侵入性强。
本地消息表:异步确保最终一致性。
Seata:AT模式(自动补偿)或Saga模式(长事务)。
七、编码与算法
手写一个线程安全的单例模式
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
二叉树层序遍历(LeetCode 102)
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
res.add(level);
}
return res;
}
八、综合提问
项目中最有挑战的技术难点是什么?如何解决的?
答案思路:
结合实际项目,描述问题背景(如高并发、数据一致性)。
分析技术选型(如引入Redis集群、分库分表)。
结果验证(性能提升数据、线上监控效果)。
总结
厦门企业对中高级Java开发者的要求侧重:
原理深度:JVM、并发、框架源码。
实战经验:高并发架构、分布式系统设计。
问题解决能力:调优、线上故障排查。
建议结合项目经验提前梳理技术亮点,并熟悉常见中间件(如RocketMQ、Dubbo)的使用场景。
希望本文助您面试顺利! 💪
学习教程(传送门)
1、掌握 JAVA入门到进阶知识(持续写作中……)
2、学会Oracle数据库用法(创作中……)
3、手把手教你vbs脚本制作(完善中……)
4、牛逼哄哄的 IDEA编程利器(编写中……)
5、吐血整理的 面试技巧(更新中……)

往期文章
第一章:日常_JAVA_面试题集15(含答案)
第二章:日常_JAVA_面试题集14(含答案)
平安壹钱包面试官:请你说一下Mybatis的实现原理
Java开发-热点-热门问题精华核心总结-推荐
往期文章大全……
一键三连 一键三连 一键三连~
本人详解
作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》
公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题
中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯
转载说明:务必注明来源(注明:作者:王文峰哦)
一键三连 一键三连 一键三连~
以上就是今天的内容,关注我,不迷路


















暂无评论内容