StringBuffer与String类进行字符串连接时有什么区别?
发布网友
发布时间:2022-04-24 14:07
我来回答
共3个回答
懂视网
时间:2022-04-24 18:29
大字符串的连接最好使用数组,把每个子串放入数组元素,再执行join()连接起来,其效率比+=有明显的提高。
因此,可以由此原理写一个简单的 StringBuffer 类,在遇到大字符串连接时可以派上用场。
//by misshjn
function StringBuffer(){
this.data = [];
}
StringBuffer.prototype.append = function(){
this.data.push(arguments[0]);
return this;
}
StringBuffer.prototype.toString = function(){
return this.data.join("");
}
或者这样也可以
(参考)
function method2()
{
var result = "";
var a = new Array();
for(var i=0; i
{
a[i] = str;
}
result = a.join(""); a=null;
return result;
}
热心网友
时间:2022-04-24 15:37
他们的区别是很大的,它们是两个独立的类,可以这么说吧,除了名字有些相似,完全不相干.String类是不可改变的,如果你更改了String类的实例,那么以前的就“不存在了”,所指向的是一个新的实例。而StringBuffer类是可以更改的。
看如下例子,体会这一点:
String s1="Hello";
String s2="Hello";
if(s1==s2)
System.out.println("Equal");
else
System.out.println("Not equla");
这个程序片断将输出Equal,原因是String类的实例是不能更改的.在生成第2个实例时它发现在缓冲池中已经有了"Hello"字符串,于是它就直接索引到这个字符串.
然而如果,你将第二行代码改为:
String s2 = new String("Hello");
再运行结果将是Not equal,因为更换了一个构造器形式,在生成第二个实例时,它就不在缓冲池中索引了,而是直接在内存中构造这样一个对象.因此,其句柄的值是不同的.
也就是说,当你更改了String类的实例,那么其句柄索引的将是在Heap Memory的另外一个位置的对象,以前的就不能再索引到了.
但是,StringBuffer类却不是如此,如果你更改了它的实例,但是在Heap Memory的缓冲池中,索引的是同一个实例.即更改了实例,但句柄的只是不变的,它是可以更改的!
热心网友
时间:2022-04-24 16:55
StringBuffer是在内存开辟一块存储空间,在里面可以增加字符,如果满了的话,再增加存储空间
String是一个常量,进行连接时,会创建一个新的String对象,如果进行连接很频繁的话用StringBuffer,String的效率比较底.