问题:判断字符串是否为对称字符串?
代码实现:
public static boolean checkString(String s) {
StringBuilderstr1 = new StringBuilder(s);
StringBuilderstr2 = str1.reverse();//字符反转
return str1.equals(str2);
}
发现字符串怎么比较都是true? 什么问题了?
开始研究问题:
查看StringBuilder的源码代码,发现 没有重写equals 方法,查看它的父类AbstractStringBuilder 有没有写这个方法,方法没有,就知道 str1调用了Object 方法
public boolean equals(Object obj) {
return (this == obj);
}
我们现在发现 str1.equals(str2)方法 没有问题:看下 reverse()方法:
StringBuilder调用了父类方法:
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
AbstractStringBuilder的方法实现:
public AbstractStringBuilder reverse() {
boolean hasSurrogates = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j;
char cj = value[j];
char ck = value[k];
value[j] = ck;
value[k] = cj;
if (Character.isSurrogate(cj) ||
Character.isSurrogate(ck)) {
hasSurrogates = true;
}
}
if (hasSurrogates) {
reverseAllValidSurrogatePairs();
}
return this;
}
我们发现是 返回的this 还是str1 所以 方法结果是true
那我们怎么解决了,看下toString()就知道了
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}