先看下equals方法,这个方法重写了Object的equals方法。作用是比较两个字符串的序列是否相等。进入方法内部,可以看到
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
这个equals方法的关键在于只会查看传入的object是否可以转换为String类,又因为String类是final的,无法被继承,相当于只会处理String类的对象,如果不是String类型,直接返回false。
再看下contentEquals(StringBuffer sb)这个方法
public boolean contentEquals(StringBuffer sb) {
synchronized (sb) {
return contentEquals((CharSequence) sb);
}
}
他调用了contentEquals(CharSequence cs)方法,又因为CharSequence是String,StringBuilder,StringBuffer的父类,所以他可以处理多个类型的参数。
到这里其实已经挺明白了,就是contentEquals可以对比CharSequence子类的字符序列,功能范围比String类的更加大,下面来看看几个小测试
String a ="hello java";
String b = new String("hello java");
StringBuilder sb = new StringBuilder("hello java");
System.out.println(a.equals(b));
System.out.println(a.equals(sb));
System.out.println(a.contentEquals(sb));
结果为:
true
false
true