前言
String和StringBuffer本质上修饰字符串,只是意义不同,StringBuffer被称为字符串缓冲区
我们先来看看string类的例子
公共类工作1 {
publicstaticvoidmain (字符串[ ] args ) {
字符串s=' hello ';
stringS1=s.substring(3;
system.out.println(s==S1; //结果为假
}
}
让我们看一下StringBuffer类的示例
公共类工作1 {
publicstaticvoidmain (字符串[ ] args ) {
string buffer ab1=new string buffer (;
string buffer ab2=ab1.append (hello );
system.out.println(ab1==ab2; //结果为true
}
}
来看,两者的内存分布图如下所示。
根据内存映射,除了直接使用String s='hello '创建新对象之外,String不会创建新对象。 除此之外,无论是方法返回的String类型、直接从构造函数创建的字符串,还是变量的拼接,只要两边有一个变量,就必须创建新对象
StringBuffer在StringBuffer中的方法操作中返回StringBuffer类型的变量,这与原始StringBuffer变量相同。
字符串STT1=new string (hello );
字符串STT2=新字符串(world );
system.out.println(STT1STT2;
String stt1='hello '
字符串STT2=新字符串(world );
system.out.println(STT1'world ';
//上面的两个连接都可以
//这种东西可以连接起来
string buffer ab1=new string buffer (;
string buffer ab2=ab1.append (hello );
system.out.println(ab2'Hello ';
//这种东西不能拼接
string buffer ab1=new string buffer (ABC );
string buffer ab2=ab1.append (hello );
system.out.println(ab2ab1;
最后,我要总结三个区别:
1、String可以用算术运算符连接字符串(两边有一个变量字符串也可以用常量字符串连接) (StringBuffer也不能)如果除了两边以外有一个常量字符串对象,例如ab2 ' heed
2、String表示线程不安全,执行效率高。 字符串缓冲区则相反
3、String对象的值不变StringBuffer的值是可变的(即,在两者之间可以用方法修改原始StringBuffer变量并将其分配给新的StringBuffer变量) )
4、创建String对象时,可以选择String a='abc ',但不能直接这样创建StringBuffer。 string buffer pj1=new string buffer (' ABC ' );