Java 面试的的时候你被提过哪些问题?
Java 面试可以问的问题太多了,我目前在 BAT 某厂任职高级技术专家,不过从未离开过开发一线,自己也做面试官,说说我面试的时候一般会问什么问题吧。其实具体哪个问题不是关键,我想说的是这些问题背后,作为面试官是怎么想的。
Java 中操作字符串都有哪些类?它们之间有什么区别?
答案是这样的:
String,StringBuffer,StringBuilder 。区别 String 声明的是不可变的对象,每次操作必然产生一个新的对象; StringBuffer 和 StringBuilder 都继承自抽象类 AbstractStringBuilder ; StringBuffer 具备线程安全性;
在使用场景上,并发必选 StringBuffer,迭代必选 StringBuilder,普通场景选 String,避免中途不必要的类型转换开销。
虽然看起来简单,但从答案组织策略来看,知道有什么,知道为什么,知道怎么用缺一不可,否则就等着面试官的灵魂拷问吧。
这里面还有两个加分项:
1.知道 StringBuffer 和 StringBuilder 都继承自抽象类 AbstractStringBuilder
2.String 的源码解读:final 修饰–>不可变–>每次操作都会生成新的 String 对象;对比 StringBuffer 和 StringBuilder–>值可变,拼接字符串开销
这只能算开场热身,接下来才是重点。
面试官会问你线程安全性。可以直接查源码,找 synchronized 、线程锁,得到结论:StringBuffer 具备线程安全性。
你以为要结束了?接着问:既然 StringBuffer 具备线程安全性,迭代开销又小,那我们在工程实践中是不是首选 StringBuffer 就可以了?这就是考验你的批判性思维。
JDK 和 JRE 有什么区别?
普通解答:具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果需要运行 Java 程序,只需安装 JRE 就可以了,如果需要编写 Java 程序,需要安装 JDK 。
追问:除了 javac,你还了解些什么命令行工具,它们的用途是什么?
- Jcmd:综合工具
- jps:虚拟机进程状况工具
- jstat:虚拟机统计信息监视工具
- jinfo:Java 配置信息工具
- jmap:Java 内存映像工具
……
追问:对于 jstat,你了解哪些参数?

这里面试官可能会视你的回答继续来问。
1 )如果你提到 class,面试官可能会
追问一:Class 加载的时机?
回答要点:
- 启动类加载器,根转载器,用户不可访问,Bootstrap ClassLoader,加载 JAVA_HOMElib,或者被-Xbootclasspath 参数限定的类;
- 扩展类加载器,Extension ClassLoader,加载libext,或者被 java.ext.dirs 系统变量指定的类;
- 应用程序类加载器,Application ClassLoader,加载 ClassPath 中的类库;
- 自定义类加载器,通过继承 ClassLoader 实现,一般是加载我们的自定义类。
追问二:Class 加载的过程?
回答:加载→验证→准备→解析→初始化→使用→卸载
2 )如果你提到了 gc,面试官可以问:谈谈你对 Java 虚拟机栈的了解。
然后追问:JVM 的垃圾回收算法有哪些?
就不一一贴答案了,有兴趣的可以看B 站完整视频。
再举个例子:
== 和 equals 的区别是什么?
答案要点:两个方法都是比较等价性,它们的区别要从“基本类型”和“引用类型”来看,作为基本类型来说,它们比较的都是值,作为引用类型——对象来说,它们比较的是双方是否为同一个对象。
如果你看过 equals()的原生实现的话,就可以发现它们之间直接的关系:
public boolean equals(Object obj){ return (this == obj); }
所以能说出下面的内容则加分:我们可以通过重载 Object 中的 equals 方法来实现自定义的等价计算方法。比如,在 String 类型中,由于源码中重新实现了该方法,所以会产生下面的结果:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
Tips:用字符串常量实例化的 String 的内容其实是保留在常量区。
例如:
String x = “string”
String y = “string”
x==y ——> true
引用的都是常量区的同一个数据项,所以有上面的结果。
这题的考察点是 equals()的概念,实际要求是平时对源码的深挖意识即技术钻研和批判性思维。
HashMap 、Hashtable 、TreeMap 有什么区别?
Hashtable 、HashMap 、TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型。
Hashtable 是 Java 类库提供的一个哈希实现,本身是同步的,不支持 null 键和 null 值,由于同步导致性能开销,所以已经很少被推荐使用。
HashMap 是应用更加广泛的哈希表实现,行为上大致与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和 null 值等。通常情况下 HashMap 进行 get 和 put 操作可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。
TreeMap 则是基于红黑树的一种提供顺序访问的 Map,它的 get 、put 、remove 之类的操作都是 O(logn)的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。
若在单线程中,我们往往会选择 HashMap ;而在多线程中,则会选择 Hashtable ;若不能插入 null 元素,则选择 Hashtable 。
总之,大厂面试 Java 程序员的基本原则就是从常识开始,逐渐诱导,考察原理理解的完整度和深度。考察思路:
- 简单的话题引入,麻痹候选人
- 找一个角度 /工具让候选人去匹配场景
- 深挖背后的原理
面试题成千上万,听起来只是要问题的解法方向。 ——其实不是
比如面试官问:
- 你的系统最高并发是多少?
- 如果有一天并发达到 5 万 KPS,系统需要哪些改进?
- 当然也可以问,在你的系统架构里面
- 高速缓存 /数据库分表,这些的用途是什么?它们的原理是什么?
这些其实是一个问题,就是高并发。 技术万变不离其宗,讲究的是整体性的通用技术栈。
最后,面试中你的每一次回答都要珍惜,每一句话都要斟酌。你要告诉面试官:你真的很专业。
总体来说,大厂招聘要求是越来越严苛的。所以在我主讲的《Java 高级工程师 P6+》打法就是技术栈的通透讲授、源码的分析导读、贴近真实的工程实践、大厂思维的架构升级。目标也不是培养普通搬砖码农,而是懂原理、知源码、会刷题、能搭建高可用架构的高级工程师 /架构师,现在前两章免费试听哦~
关于大厂 Java 面试的特点和应对方式,我将在《 Java 高级工程师 P6+》首节公开课中分享,有兴趣的同学可以来免费试听前两章。