文章目录
一、基础概念篇(必考三连击)
1. ==和equals()的区别?(送分题警告)
==
是运算符:比较基本类型的值/引用类型的地址值(内存地址)equals()
是方法:默认比较地址值(与==相同),但String/包装类等已重写- (超级重要)开发中自定义类必须重写equals()!!!
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
2. String为什么不可变?(内存优化关键)
- 底层用final char[]存储(JDK9后是byte[])
- 字符串池复用机制(new String(“a”) VS "a"的区别)
- 线程安全性带来的性能优势(多线程操作无需同步)
3. 接口和抽象类的区别(OOP基础)
对比项 | 接口 | 抽象类 |
---|---|---|
构造方法 | 没有 | 有 |
方法实现 | JDK8前不能有 | 可以有具体方法 |
变量类型 | 默认public static final | 无限制 |
继承方式 | 多继承 | 单继承 |
二、集合框架篇(ArrayList/HashMap重点)
4. HashMap底层原理(连环追问预警)
- JDK7:数组+链表(头插法有死循环风险)
- JDK8:数组+链表/红黑树(链表长度>=8转树)
- 扩容机制:默认16,加载因子0.75(扩容2倍)
// 典型面试场景
面试官:HashMap线程安全吗?
你:不安全!ConcurrentHashMap采用分段锁/Node+CAS(JDK8)
面试官:HashTable和ConcurrentHashMap区别?
你:(稳住)HashTable全表锁,效率低;ConcurrentHashMap锁粒度更细
5. ArrayList扩容机制(动态数组核心)
- 初始容量10(空参构造时)
- 扩容公式:newCapacity = oldCapacity + (oldCapacity >> 1)
- 1.5倍扩容但可能跳跃(比如10→15→22→33)
三、多线程篇(高并发必考)
6. synchronized和Lock的区别(锁机制)
- synchronized是关键字,Lock是接口
- synchronized自动释放锁,Lock必须手动unlock()
- Lock支持尝试获取锁、公平锁等高级特性
7. 线程池七大参数(调优基础)
ThreadPoolExecutor(
int corePoolSize, // 核心线程数(常驻)
int maximumPoolSize, // 最大线程数(临时工)
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
)
四、JVM篇(调优必备)
8. 类加载过程(双亲委派考点)
- 加载(Loading):读取class文件
- 验证(Verification):格式校验
- 准备(Preparation):分配内存(静态变量初始值)
- 解析(Resolution):符号引用转直接引用
- 初始化(Initialization):执行clinit方法
(划重点)双亲委派模型:避免重复加载+防止核心类被篡改
9. GC算法与回收器(调优重点)
- 标记-清除(内存碎片问题)
- 复制算法(新生代使用)
- 标记-整理(老年代使用)
- G1回收器特点:分Region回收+可预测停顿
五、设计模式篇(代码设计能力)
10. Spring中的设计模式(框架原理)
- 工厂模式:BeanFactory
- 代理模式:AOP实现
- 单例模式:默认Bean作用域
- 模板方法:JdbcTemplate
六、实战技巧篇(面试加分项)
11. 项目难点回答模板
- STAR法则:Situation(背景)→ Task(任务)→ Action(行动)→ Result(结果)
- 示例:秒杀系统如何解决超卖?
- 使用Redis分布式锁
- 库存预扣减+异步下单
- 熔断降级策略
12. 算法题准备建议
- LeetCode热题100(至少刷两遍)
- 剑指Offer经典题(变形题频繁出现)
- 手写排序算法(快排/归并必须会)
避坑指南(血泪经验)
- 不要背答案!要理解实现原理
- 项目经历准备3个技术难点(附解决方案)
- 遇到不会的问题时:先思考再回答,展示解题思路
- 最后反问环节:问团队技术栈/新人培养机制
(重要提醒)面试后24小时内发送感谢邮件,内容包含:
- 对某个技术问题的补充思考
- 对面试官某个观点的认同
- 表达加入团队的强烈意愿
各位Javaer冲鸭!记得面试前吃块巧克力缓解紧张(亲测有效),祝大家offer拿到手软~