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

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

典型回答

这个其实不是考察你背没背过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
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;
}