相同点:
它们都可以存储和操作字符串
不同点:
1.String类提供了数值不可改变的字符串,修改的只是它的一个副本
StringBuffer类可以对本身的对象进行修改
String s1 = new String("123");
String s2 = s1;
s1 = s1.concat("456");
System.out.println(s1);
System.out.println(s2);
运行结果:
123456
123
分析:
s1和s2指向同一块堆空间,当s1内容需要发生变化时,会改变它的一个副本,s1不再指向原空间,而指向一块新的空间
初始状态:
:
结束状态:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
StringBuffer b1 = new StringBuffer("123");
StringBuffer b2 = b1;
b1 = b1.append("456");
System.out.println(b1);
System.out.println(b2);
运行结果:
123456
123456
分析:
StringBuffer改变的是自身对象的内容,而不是一个副本
初始状态:
结束状态:
2.String重写了equals方法
StringBuffer没有重写equals方法
System.out.println(new String("123").equals(new String("123")));
System.out.println(new StringBuffer("123").equals(new StringBuffer("123")));
运行结果:
true
false
3.StringBuffer进行字符串修改操作时效率比String高
long start1 = System.currentTimeMillis();
String str = new String();
for (int i = 0; i < 10000; i++) {
str = str + i;
}
long end1 = System.currentTimeMillis();
long start2 = System.currentTimeMillis();
StringBuffer strb = new StringBuffer();
for (int i = 0; i < 10000; i++) {
strb = strb.append(i);
}
long end2 = System.currentTimeMillis();
System.out.println("String运行时间:"+(end1-start1)+"毫秒");
System.out.println("StringBuffer运行时间:"+(end2-start2)+"毫秒");
运行结果:
String运行时间:255毫秒
StringBuffer运行时间:1毫秒