今天刷题的时候碰到一个问题,将一个字符串 new了两个StringBuilder对象,用equals方法比较两个StringBuilder时却是false,奈何本人基础太差,百思不得其解,后面自己写了一个测试类测试了一下。
public class Test {
public static void main(String[] args) {
String s1 = new String("abcdefg");
String s2 = new String("abcdefg");
StringBuilder stb1 = new StringBuilder(s1);
StringBuilder stb2 = new StringBuilder(s1);
StringBuffer stbf1 = new StringBuffer(s1);
StringBuffer stbf2 = new StringBuffer(s1);
System.out.println("String=>" + s1.equals(s2));
System.out.println("StringBuilder=>" + stb1.equals(stb2));
System.out.println("StringBuffer=>" + stbf1.equals(stbf2));
}
}
输出:
接着又去看了看源码,发现StringBuilder直接使用了Object中的equals方法(StringBuffer也一样):
public boolean equals(Object obj) {
return (this == obj);
}
而Object中的equals方法默认是用“==”比较的,所以当new了两个新的StringBuilder后,虽然内容一样,但是内存地址却不一样,所以会出现false的情况。
但是String类中重写了equals方法,只对String的内容进行比较,所以此String.equals非彼StringBuilder.equals