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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘立波 中级黑马   /  2012-10-15 09:27  /  2780 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String 和StringBuffer的区别是什么?通常看到这个两个在一起,实在是分不出区别,求指导!

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
String字符对象是不可修改的,也就是说String字符串不能修改删除或者替换字符串中的某个字符,String对象一旦创建,实体就是可以在发生变化了,
StringBuffer能创建可以修改的字符串序列,即该类的对象的实体的内存空间可以自动的改变大小便于存放一个可变的字符串。StringBuffer对象可以调用append()方法追加字符串序列:例如
StringBuffer s = new Stringbuffer("you are best one");
a. append("student")
现在S对象的实体是you are best one student

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String类对象内容不可修改。StringBuffer和StringBuilder就可以,而StringBuffer用于多线程比较安全,StringBuilder用于多线程就不安全
回复 使用道具 举报
STRING的长度是不可变的
StringBuffer的长度是可变的
如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
回复 使用道具 举报
String类对象内容不可改变
StringBuffer类对象内容可以改变。而且StringBuffer的功能也更强大,但StringBuffer不安全
毕老师在视频中也说到了StringBuilder,不过StringBuilder线程不安全。加同步锁就ok
回复 使用道具 举报
赫骏 初级黑马 2012-10-22 15:07:06
7#
String: 是对象不是原始类型. 为不可变对象,一旦被创建,就不能修改它的值. 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 它只能通过构造函数来建立, StringBuffer sb = new StringBuffer();
回复 使用道具 举报
杨政 中级黑马 2012-10-22 15:35:04
8#
String对象是存储你不能改动的文本字符 串,相反,如果你希望改动,则应使用StringBuffer类作为替换.
回复 使用道具 举报
李靖 中级黑马 2012-10-22 15:54:44
9#
String s = "sss"; 不可变是说对象new String("sss")是不可变的,你写s="ddd",创建了一个新的new String("ddd")对象,并让引用s 指向这个对象的地址,原来的sss被就被抛弃了。

String s = "sss";
s+= "ddd";
这样也是可以的,是不是s也是可变的呢?
实际上JVM是生成了一个临时对象BufferString,将两个字符串拼接后再保存为新对象,然后将引用s指向新对象。

在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的sss了,这个引用的名称没变,但它指向了新的String对象。

以前做项目的时候,拼接sql语句是经常用到BufferString,例如:
BufferString bf =new BufferString();
bf.append("SELECT NAME, ID,AGE");
bf.append("From user");
bf.append("where id =? and");
bf.append("age = ?");
这样写比较有层次感,同时也是因为BufferString类长度是可变的。
回复 使用道具 举报
bhxiaobo 发表于 2012-10-22 15:54
String s = "sss"; 不可变是说对象new String("sss")是不可变的,你写s="ddd",创建了一个新的new String("d ...

亲,这里执行完代码s+=“ddd”时还是会产生新对象的,所以不能说是可变吧!?

回复 使用道具 举报
李靖 中级黑马 2012-10-24 17:19:47
11#
这个变与不变应该这样理解吧,堆内存创建的字符串开辟的这块内存是不能够自动增加的,所以说它这一块是不变的,它只有通过创建新的对象来实现字符串的连接。而StringBuffer是可以通过在堆内存原有的基础上进行增加的,这样就可以避免内存的浪费。创建新的对象发生改变,这是通过改变栈指针来实现的,而堆内存原来存储并没有发生变化。如果学过C的话,对指针比较了解的话,就应该能明白了。
回复 使用道具 举报
可以从实际应用上来说:String 是常量,只要一创建出来就会在常量区分配空间,占有内存。
而StringBufffer是一个字符串缓区,从其增删改方法中就可以看出是偏向于修改数据的,举个栗子
char[] ch = { '1', 'd', 's', 'x', 'x', 'f' };
StringBuffer sb = new StringBuffer();
for (char c : ch) {
sb.append(c);//如果new个String  str, str+=c; 用这种方法每次相加后会不断产生新的常量,而这些常量是不被希望创建出来占用内存的
}
详细可以参考视频13天
回复 使用道具 举报
唐进 中级黑马 2012-10-25 00:31:53
13#
这个问题好像被问了很多遍了,面试的时候也经常被问到
回复 使用道具 举报
学习,是否可以理解为string是静态的,stringbuffer是动态的?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马