Skip to content

面试速答(先看这里)

**一句话结论:**很多人第一反应就是拿出来两个字符串,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等等。所以,正确的判断思路是:

  1. 先判断对象引用
  • 如果两个对象是同一个引用,直接返回 true。
  1. 判断类型或 null
  • 如果传入对象是 null 或类型不对,直接返回 false。
  1. 判断长度
  • 字符串长度不同,肯定不相等,直接返回 false。
  1. 判断hashcode
  • 字符串的hashcode不同,肯定不想等,直接返回 false。
  1. 逐个字符比较
  • 遍历字符数组,逐位比较,如果有不同返回 false。
  1. 都相等
  • 返回 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;
}