黑马程序员技术交流社区

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

作者: 孙宇    时间: 2011-8-15 20:32
标题: StringBuffer的疑问
在StringBuffer这个类中有个append方法用来连接拼装字符串的,
但是我直接使用str1+str2的形式去拼装岂不是很方便,为什么还要
去实例化下StringBuffer这个类然后在调用append这个方法去拼装字符串,
岂不是多此一举吗?
作者: 匿名    时间: 2011-8-15 21:28
很多人说过StringBuffer这个比String效率高,因为后者会把两个字符串相加再扔给第三个字符串。前者是直接相加,但我今天也因为这个问题,特意看了下源码,水平不足,看的稀里糊涂,就不做表示了,既然很多人这么说,就暂且相信吧,楼主有能力看源码的话,看看不就行了吗
作者: 匿名    时间: 2011-8-15 21:42
String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据
StringBuffer是用来处理字符串变量,它存储的对象是可以扩充和修改的,但是也可以存储字符串常量
String类是用来处理字符串常量,存储的字符串是不可更改的常量。
使用StringBuffer相比String的优势就是对其存储的内容进行修改。我举个例子:
public void onCreate(SQLiteDatabase db)
        {
                StringBuffer tableCreate = new StringBuffer();
                tableCreate.append("create table user ( _id integer primary key autoincrement,")
                                   .append("name text,")
                                   .append("mobilephone text,")
                                   .append("familyphone text,")
                                   .append("officephone text,")
                                   .append("position text,")
                                   .append("company text,")
                                   .append("address text,")
                                   .append("email text,")
                                   .append("othercontact text,")
                                   .append("zipcode text,")
                                   .append("remark text,")
                                   .append("imageid int)");
                db.execSQL(tableCreate.toString());
        }
这是个创建sqlite数据库的方法,在这里为什么使用StringBuffer!一旦数据库需要修改会十分方便。
作者: 匿名    时间: 2011-8-15 22:05
明显啊,首先他们在内存当中就是不同的存在方式啊
作者: 匿名    时间: 2011-8-15 22:19
因为调用StringBuffer的append方法永远都是只操作一个对象,而如果用加号连接两个String对象这样程序就会产生3个对象,所以效率比StringBuffer低,为什么会这样?我也看了下源码,因为StringBuffer的每个对象里面用的字符缓冲区都不是final来修饰的,所以缓冲区里可以任意的添加删除数据,而不用创建新的StringBuffer对象;但是String对象里面的字符缓冲区是final修饰的,所以我们只要创建了一个String对象后就不能更改这个对象的缓冲区里面的内容,只能再创建一个新的String对象然后把改变后的内容放到这个对象的缓冲区里,这就是为什么经常说String对象一旦创建就不能改变了的原因。我也只是大概看了一下源码比较它们没细看,我想基本的意思也出来了
作者: 匿名    时间: 2011-8-15 22:21
[quote] 原帖由 [i]陈希然[/i] 于 2011-08-15 22:19 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=7776&ptid=1192][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]因为调用StringBuffer的append方法永远都是只操作一个对象,而如果用加号连接两个String对象这样程序就会产生3个对象,所以效率比StringBuffer低,为什么会这样?我也看了下源码,因为StringBuffer的每个对象里面用的字符缓冲区都不是final来修饰的,所以缓冲区里可以任意的添加删除数据,而不用创建新的StringBuffer对象;但是String对象里面的字符缓冲区是final修饰的,所以我们只要创建了一个String对象后就不能更改这个对象的缓冲区里面的内容,只能再创建一个新的String对象然后把改变后的内容放到这个对象的缓冲区里,这就是为什么经常说String对象一旦创建就不能改变了的原因。我也只是大概看了一下源码比较它们没细看,我想基本的意思也出来了 [/quote]原来是一个final.....没注意到,我就觉得奇怪,他们好像差不多的样子= =




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