主题
面试速答(先看这里)
**一句话结论:**很多人第一反应就是拿出来两个字符串,for循环从头开始遍历,然后一个一个字符的比较,如果这么简单,那么就没必要问了。
60秒标准回答:
这个其实不是考察你背没背过String的equals方法,而是考察你实际写一个代码的时候考虑的全不全,是不是有fail-fast的想法
很多人第一反应就是拿出来两个字符串,for循环从头开始遍历,然后一个一个字符的比较,如果这么简单,那么就没必要问了
其实,有很多情况可以fail fast掉,不需要比较的,比如字符串长度不一致,字符串的hashcode不一致,字符串有一个为null等等。所以,正确的判断思路是
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**这个其实不是考察你背没背过String的equals方法,而是考察你实际写一个代码的时候考虑的全不全,是不是有fail-fast的想法。
- **要点2:**其实,有很多情况可以fail fast掉,不需要比较的,比如字符串长度不一致,字符串的hashcode不一致,字符串有一个为null等等。
**记忆锚点:**false → hashcode → null → equals → true → 判断类型或 null
加分表达:
- 很多人第一反应就是拿出来两个字符串,for循环从头开始遍历,然后一个一个字符的比较,如果这么简单,那么就没必要问了。
- 所以,正确的判断思路是: 如果两个对象是同一个引用,直接返回 true 。
- 判断类型或 null 如果传入对象是 null 或类型不对,直接返回 false 。
追问准备:
- 围绕「false」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「hashcode」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「null」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
这个其实不是考察你背没背过String的equals方法,而是考察你实际写一个代码的时候考虑的全不全,是不是有fail-fast的想法。
很多人第一反应就是拿出来两个字符串,for循环从头开始遍历,然后一个一个字符的比较,如果这么简单,那么就没必要问了。
其实,有很多情况可以fail fast掉,不需要比较的,比如字符串长度不一致,字符串的hashcode不一致,字符串有一个为null等等。所以,正确的判断思路是:
- 先判断对象引用
- 如果两个对象是同一个引用,直接返回
true。
- 判断类型或 null
- 如果传入对象是
null或类型不对,直接返回false。
- 判断长度
- 字符串长度不同,肯定不相等,直接返回
false。
- 判断hashcode
- 字符串的hashcode不同,肯定不想等,直接返回
false。
- 逐个字符比较
- 遍历字符数组,逐位比较,如果有不同返回
false。
- 都相等
- 返回
true。
bash
public boolean myEquals(String other) {
// 1. 引用相等
if (this == other) {
return true;
}
// 2. null 判断
if (other == null) {
return false;
}
// 3. 长度判断
if (this.length() != other.length()) {
return false;
}
// 4. hashcode判断
if (this.hashCode() != other.hashCode()) {
return false;
}
// 5. 逐字符比较
for (int i = 0; i < this.length(); i++) {
if (this.charAt(i) != other.charAt(i)) {
return false;
}
}
// 6. 全部匹配
return true;
}