黑马程序员技术交流社区

标题: 请看我贴里的两小段代码,为什么说(2)的效率要比(1)高很多? [打印本页]

作者: 罗旭维    时间: 2012-4-27 13:15
标题: 请看我贴里的两小段代码,为什么说(2)的效率要比(1)高很多?
(1)String sb=new String();
For(int j=0;j<w;j++)
{
Sb=sb+’*’;
}
(2) StringBuffer sb=new StringBuffer();
For(int j=0;j<w;j++)
{
Sb.append(‘*’);
}

作者: Friends★    时间: 2012-4-27 13:29
本帖最后由 Friends★ 于 2012-4-27 13:51 编辑

效率不一致主要是:
1、因为String是一次性开辟一段定长空间的char[],如果之后对String做修改,java是重新new一个新的String对象(char[]),然后拷贝原有对象到新对象中的。这个过程会非常消耗资源。

2、StringBuffer好处是默认开辟一个char[16],在修改字符串时是在char数组中添加内容,然后移动下标。当长度超过原有长度后,再开辟一段两倍新长度的char[]


         所以StringBuffer的高效率在于不是每次都做new char[]然后做拷贝,只有在长度不够的情况下才做,而且每次就扩展新长度的两倍。所以效率自然要高!
作者: 杨志    时间: 2012-4-27 13:34
其实
String在创建的时候,先要建立一个StringBuffer,然后在调用append(),然后在StringBuffer toSting();
这样就多出了一些操作,那么肯定在效率上要低!还有创建了StringBuffer 之后还要回收,那么又要GC去回收。
这肯定又要浪费时间。
还有一点就是String是不可改变的。那么你每次执行Sb=sb+"*";其实都是在内存中去新创建了一个对象。然后在把原来的交给GC 去处理。那么这样肯定就要耗费资源和时间。

这上我上次问问题之后的总结。不知道对你怎么样!谢谢!
作者: 贾联国    时间: 2012-4-27 13:50
本帖最后由 贾联国 于 2012-4-27 13:52 编辑

String是不可变对象,一旦被创建,就不能修改它的值。 对于已经存在的String的修改都会重新创建一个新的对象,然后把值保存进去!
StringBuffer是一个可变对象,对他进行修改的时候不会像String那样重新建立对象,只要用append 方法就可以对StringBuffer添加进行操作。

1)String sb=new String();
For(int j=0;j<w;j++)
{
Sb=sb+’*’;//一直在创建新的sb对象
}
(2) StringBuffer sb=new StringBuffer();
For(int j=0;j<w;j++)
{
Sb.append(‘*’);
}

作者: 邵中国    时间: 2012-4-27 14:10
第一个 String对象不可变,每循环一次都要在堆新建对象
第二个 StringBuffer内容可变,只需建一个对象,效率高
作者: 光sail    时间: 2012-4-27 15:48
String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
使用 StringBuffer 主要就是在性能上的考虑。 String 是一种非常常用的数据类型,但由于 String 是不可变对象,在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。不过,一般做为简单的字符串传递和其它操作,只要不改变字符串内容的操作,用 String 效率会高一些。stringBuffer 比string有一个append()方法..可以在原有的基础上+数据..
作者: 胡奎    时间: 2012-4-27 17:05
说到底就是String和stringBuffer的区别
String是不可变的字符串,字符串的连接需要不断地创建对象
而StringBuffer是可变字符创,所以效率高
作者: 马伟恒    时间: 2012-4-27 19:33
因为String的特点就是定长的,你每次++都会计算是否超过额定空间,而stringBuffer是长度可变的,不存在这个问题
作者: 一生一世    时间: 2012-4-27 19:52
大家说的都很好,String是对一串字符经行操作,是不可变类,而StringBuffer是也是对一串字符经行操作,但是它是可变类,
String:是对象不是原始数据类型,为不可变对象,一旦在常量池中建立就不能修改它的值,对于已经存在的String的修改,都是创建新的对象,然后把新值保存就去。
StringBuffer:是一个可变的对象,当对他经行修改时,不用再重新建立对象,直接调用append方法就可以存储值
作者: 一生一世    时间: 2012-4-27 19:55
也可以这样理解,String就像是一个小碗,每次往里面放东西时,东西太多、太大就需要更换更大的碗,而StringBuffer就像是一个大盆,随便往里面扔东西就行,不用管它能否装的下(其实StringBuffer有自增的方式),这样好理解,也好记忆,
作者: 罗旭维    时间: 2012-4-28 23:36
谢谢大家的回答,我已经理解了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2