黑马程序员技术交流社区

标题: StringBuffer和Sting的疑问 [打印本页]

作者: wangxinyu    时间: 2012-6-13 02:26
标题: StringBuffer和Sting的疑问
在StringBuffer这个类中有个append方法用来连接拼装字符串的,
但是我直接使用str1+str2的形式去拼装岂不是很方便,为什么还要
去实例化下StringBuffer这个类然后在调用append这个方法去拼装字符串,
岂不是多此一举吗?
作者: 江南    时间: 2012-6-13 02:33
StringBuffer的append方法永远都是只操作一个对象,而如果用加号连

接String对象这样程序就会产生多个对象,所以效率比StringBuffer低,为

什么会这样?我也看了下源码,因为StringBuffer的每个对象里面用的字符缓冲

区都不是final来修饰的,所以缓冲区里可以任意的添加删除数据,而不用创建

新的StringBuffer对象;但是String对象里面的字符缓冲区是final修饰的,所

以我们只要创建了一个String对象后就不能更改这个对象的缓冲区里面的内容,

只能再创建一个新的String对象然后把改变后的内容放到这个对象的缓冲区里,

这就是为什么经常说String对象一旦创建就不能改变了的原因。我也只是大概看

了一下源码比较它们没细看,我想基本的意思也出来了

作者: 李元峰    时间: 2012-6-13 02:40
首先
StringBuffer是 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容
在 API 里 可以看到
而 String是字符串常量 ,他的值创建之后不能更改 但是 StringBuffer可以,因为String对象是不可更改的 所以String对象是可以共享的,在内存中是放在数据池里面,可以被其他对象共享
而你说的 Str1+str2 你必须重新创建新的String对象,而这是要消耗内存的!
作者: 何拴绪    时间: 2012-6-13 07:21
给楼主一个例子把:假如有一个字符串数组,你要把其中的字符串都依次连接起来,利用字符串连接就比较低效,占用内存。你使用StringBuffer就比较高效:
String[] str={"abc","cde","fgi"};
StringBuilder sb = new  StringBuilder();               
for(String s: str) {
     sb.append(s);                       
}
  System.out.println(sb);




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