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,同时还包含了编译 Java 源码的编译器 javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果需要运行 Java 程序,只需安装 JRE 就可以了,如果需要编写 Java 程序,需要安装 JDK 。
追问:除了 javac,你还了解些什么命令行工具,它们的用途是什么?
……
追问:对于 jstat,你了解哪些参数?
1 )如果你提到 class,面试官可能会
追问一:Class 加载的时机?
回答要点:
追问二:Class 加载的过程?
回答:加载→验证→准备→解析→初始化→使用→卸载
2 )如果你提到了 gc,面试官可以问:谈谈你对 Java 虚拟机栈的了解。
然后追问:JVM 的垃圾回收算法有哪些?
就不一一贴答案了,有兴趣的可以看B 站完整视频。
再举个例子:
答案要点:两个方法都是比较等价性,它们的区别要从“基本类型”和“引用类型”来看,作为基本类型来说,它们比较的都是值,作为引用类型——对象来说,它们比较的是双方是否为同一个对象。
如果你看过 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()的概念,实际要求是平时对源码的深挖意识即技术钻研和批判性思维。
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 程序员的基本原则就是从常识开始,逐渐诱导,考察原理理解的完整度和深度。考察思路:
面试题成千上万,听起来只是要问题的解法方向。 ——其实不是
比如面试官问:
这些其实是一个问题,就是高并发。 技术万变不离其宗,讲究的是整体性的通用技术栈。
最后,面试中你的每一次回答都要珍惜,每一句话都要斟酌。你要告诉面试官:你真的很专业。
总体来说,大厂招聘要求是越来越严苛的。所以在我主讲的《Java 高级工程师 P6+》打法就是技术栈的通透讲授、源码的分析导读、贴近真实的工程实践、大厂思维的架构升级。目标也不是培养普通搬砖码农,而是懂原理、知源码、会刷题、能搭建高可用架构的高级工程师 /架构师,现在前两章免费试听哦~
关于大厂 Java 面试的特点和应对方式,我将在《 Java 高级工程师 P6+》首节公开课中分享,有兴趣的同学可以来免费试听前两章。