问题描述
- Java中string和stringbuffer有什么区别???
-
Java中string和stringbuffer有什么区别???求各位前辈指点
解决方案
String,StringBuilder,StringBuffer都实现了CharSequence接口.
Java中的String是不可变的,即它本身没有提供改变自身的方法,它的看似改变的方法都是返回一个新的字符串,在多个字符串(含变量)做连接操作(即“+”)时,它内部会使用StringBuilder.append操作,最后才调用toString方法,返回一个新的字符串
StringBuilder和StringBuffer都提供了改变自身的方法,不同点是而StringBuffer中的大多数方法都是synchronized,在方法的执行过程中必须获取锁以及释放锁,而这都将影响它的性能,因此在单线程环境中或者方法内部的一般都应该使用StringBuilder
解决方案二:
就是一个变量和常量的关系StringBuffer对象的内容可以修改而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象比较StringBuffer str = new StringBuffer("a");str.append("bc");String str2 = "a";str2 = str2 + "bc";str引用的一直是同一对象而str2引用的在两句中是完全不同的对象
解决方案三:
性能上的不同,string追加字符串是非常耗费性能的。因为每次追加都需要重新开辟内存,并且复制一次先前的那个字符串。
我们知道,很多的时候,我们需要大量追加字符串,比如
for (Record : List)
{
result = result + Record["field"].toString();
}
此时用StringBuffer性能会好很多。
解决方案四:
性能上的不同,string追加字符串是非常耗费性能的。因为每次追加都需要重新开辟内存,并且复制一次先前的那个字符串。
我们知道,很多的时候,我们需要大量追加字符串,比如
for (Record : List)
{
result = result + Record["field"].toString();
}
此时用StringBuffer性能会好很多。
解决方案五:
性能上的不同,string追加字符串是非常耗费性能的。因为每次追加都需要重新开辟内存,并且复制一次先前的那个字符串。
我们知道,很多的时候,我们需要大量追加字符串,比如
for (Record : List)
{
result = result + Record["field"].toString();
}
此时用StringBuffer性能会好很多。
解决方案六:
性能上的不同,string追加字符串是非常耗费性能的。因为每次追加都需要重新开辟内存,并且复制一次先前的那个字符串。
我们知道,很多的时候,我们需要大量追加字符串,比如
for (Record : List)
{
result = result + Record["field"].toString();
}
此时用StringBuffer性能会好很多。
解决方案七:
变量与常量区别:String是内容不可变的,一旦改变会产生新的对象,StringBuffer是内容可变的
String str=“abc”;
str+="d";(结果:abcd产生新的对象而不是原有那个String对象,开辟新的内存空间)
StringBuffer sb = new StringBuffer(“abc”);
sb.append(“d”);(结果:abcd 还是原来那个对象,不会开辟新的内存空间)
解决方案八:
在Java中内存中有常量池,当改变string的值时先会去常量池中查找看有没有如果有则直接将引用到这个对象,而如果不存在,而常量池中已存在的字符可以组成所需的String对象则组成String对象,
String这个引用变量引用到这个组合成的对象,如果常量池中没有则才会生成一个改变后的对象,同时引用到这个变量,所以可以说String引用变量的值是不能改变的
因为只要以改值也就可能会生成一个新对象,而StringBuffer 是一个可以改变内容的变量,你改变之后指向的还是原来那个对象,也就是引用变量的值没变!
解决方案九:
简单的字符串赋值之类 的用String就好,如果 是大量的字符串拼接,StringBuffer效率更高。
解决方案十:
就是一个变量和常量的关系StringBuffer对象的内容可以修改而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象比较StringBuffer str = new StringBuffer("a");str.append("bc");String str2 = "a";str2 = str2 + "bc";str引用的一直是同一对象而str2引用的在两句中是完全不同的对象