java面试题目

TE 常识指南 2

"HashMap的put方法怎么实现?线程不安全体现在哪?"

这道题看似基础,但能筛掉80%的候选人,标准答案会说"数组+链表+红黑树",但面试官真正想听的是你对细节的掌控。

进阶回答要点

  1. 扩容机制:当元素数量超过loadFactor * capacity(默认0.75*16)时触发扩容,新容量是原来的2倍,这里要强调resize()方法的两个关键操作:重新计算哈希值((n-1)&hash)和转移元素。
  2. 线程不安全场景
    • 扩容时多线程可能导致链表成环(JDK1.7的致命问题)
    • 并发put导致数据覆盖(比如两个线程同时插入到同一个桶)
    • 迭代器遍历时修改结构会抛ConcurrentModificationException

实战建议:如果面试官追问"怎么解决线程不安全",别只说ConcurrentHashMap,可以展开讲JDK1.8的优化:分段锁升级为CAS+synchronized,用synchronized锁住链表头节点或红黑树根节点,减少并发冲突。


"volatile关键字的作用?能否保证线程安全?"

这道题能考察你对JVM内存模型的理解深度,我见过有人把volatilesynchronized混为一谈,也有人只会背"可见性+有序性"。

正确理解

java面试题目-第1张图片-TE汇通-海归留学生综合信息平台

  1. 可见性:修改后立即刷新到主内存,其他线程读时直接从主内存获取
  2. 有序性:禁止指令重排序(通过插入内存屏障实现)
  3. 不保证原子性:比如i++这种复合操作仍然需要同步

经典反例

class VolatileExample {
    volatile boolean flag = false;
    int count = 0;
    void writer() {
        count = 100;
        flag = true;  // 线程A执行到这里
    }
    void reader() {
        if (flag) {   // 线程B可能看到flag=true但count=0
            System.out.println(count);
        }
    }
}

延伸问题:如果面试官问"DCL单例模式为什么要用volatile",可以结合指令重排序解释:没有volatile时,其他线程可能看到未完全初始化的 *** 实例。


"JVM垃圾回收算法有哪些?CMS和G1的区别?"

这道题能区分出真正做过性能优化和只会背概念的人,我团队里有个高级工程师,就是因为能清晰说出不同GC算法的适用场景,直接跳过了技术二面。

核心算法

  1. 标记-清除:产生内存碎片
  2. 标记-整理:移动 *** ,无碎片但停顿时间长
  3. 复制算法:年轻代常用(Eden:Survivor=8:1:1)
  4. 分代收集:年轻代(Minor GC)+老年代(Full GC)

CMS vs G1: | 特性 | CMS | G1 | |-------------|------------------------------|------------------------------| | 目标 | 低停顿 | 可预测停顿 | | 收集范围 | 老年代 | 全堆 | | 内存布局 | 连续内存块 | R *** ion分区(1MB~32MB) | | 碎片处理 | 定期Full GC | 混合收集时整理 | | 适用场景 | 大堆但响应时间敏感 | 大堆且需要可预测停顿 |

实战建议:如果问"生产环境选哪个",可以这样回答:"如果堆内存<4G且追求低延迟用CMS;>4G且需要可预测停顿用G1;JDK11+优先考虑ZGC或Shenandoah。"


给海归求职者的特别建议

回国面试时,除了技术深度,还要注意:

  1. 表达方式:把"我们项目"改成"我主导/参与的项目",突出个人贡献
  2. 技术栈匹配:国内大厂常用Spring Cloud、Dubbo,提前熟悉相关生态
  3. 软技能展示:用STAR法则描述项目,重点说冲突解决和优化思路

需要系统准备的话,可以关注【TE汇通】,这个平台专门做海归求职辅导,从简历修改到面试模拟都有专业导师一对一指导,特别是大厂内推资源很实用。


最后想说,面试不是背题考试,而是展示你解决实际问题的能力,我当年面试阿里时,被问到"如何设计一个百万QPS的短链系统",就是从HashMap的并发问题延伸到分布式缓存,最后拿到P7 offer,技术深度+工程思维+清晰表达,才是通关密码。

标签: Java 面试题

抱歉,评论功能暂时关闭!