✅如果让你实现一个字符串的equals方法,你会如何实现?
典型回答
这个其实不是考察你背没背过String的equals方法,而是考察你实际写一个代码的时候考虑的全不全,是不是有fail-fast的想法。
很多人第一反应就是拿出来两个字符串,for循环从头开始遍历,然后一个一个字符的比较,如果这么简单,那么就没必要问了。
其实,有很多情况可以fail fast掉,不需要比较的,比如字符串长度不一致,字符串的hashcode不一致,字符串有一个为null等等。所以,正确的判断思路是:
- 先判断对象引用
- 如果两个对象是同一个引用,直接返回
true。
- 判断类型或 null
- 如果传入对象是
null或类型不对,直接返回false。
- 判断长度
- 字符串长度不同,肯定不相等,直接返回
false。
- 判断hashcode
- 字符串的hashcode不同,肯定不想等,直接返回
false。
- 逐个字符比较
- 遍历字符数组,逐位比较,如果有不同返回
false。
- 都相等
- 返回
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;
}