跳转至

如果让你实现一个字符串的equals方法,你会如何实现?

典型回答

这个其实不是考察你背没背过String的equals方法,而是考察你实际写一个代码的时候考虑的全不全,是不是有fail-fast的想法。

很多人第一反应就是拿出来两个字符串,for循环从头开始遍历,然后一个一个字符的比较,如果这么简单,那么就没必要问了。

其实,有很多情况可以fail fast掉,不需要比较的,比如字符串长度不一致,字符串的hashcode不一致,字符串有一个为null等等。所以,正确的判断思路是:

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