A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangxinyu 初级黑马   /  2012-6-13 02:26  /  1482 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在StringBuffer这个类中有个append方法用来连接拼装字符串的,
但是我直接使用str1+str2的形式去拼装岂不是很方便,为什么还要
去实例化下StringBuffer这个类然后在调用append这个方法去拼装字符串,
岂不是多此一举吗?

3 个回复

倒序浏览
StringBuffer的append方法永远都是只操作一个对象,而如果用加号连

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

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

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

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

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

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

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

了一下源码比较它们没细看,我想基本的意思也出来了
回复 使用道具 举报
首先
StringBuffer是 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容
在 API 里 可以看到
而 String是字符串常量 ,他的值创建之后不能更改 但是 StringBuffer可以,因为String对象是不可更改的 所以String对象是可以共享的,在内存中是放在数据池里面,可以被其他对象共享
而你说的 Str1+str2 你必须重新创建新的String对象,而这是要消耗内存的!
回复 使用道具 举报
给楼主一个例子把:假如有一个字符串数组,你要把其中的字符串都依次连接起来,利用字符串连接就比较低效,占用内存。你使用StringBuffer就比较高效:
String[] str={"abc","cde","fgi"};
StringBuilder sb = new  StringBuilder();               
for(String s: str) {
     sb.append(s);                       
}
  System.out.println(sb);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马