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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 昝文萌 中级黑马   /  2013-9-4 18:31  /  1180 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 昝文萌 于 2013-9-5 12:09 编辑

查看API时,我发现关于StringBuffer是这样写的,一个类似于String字符串的缓冲区,既然他们都是相同的缓冲区,我想为什麽不直接把StringBuffer的方法封装到String里面不就行了吗,为什么还要在搞个StingBuffer类!它们有啥区别?

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

4 个回复

倒序浏览
String是不可以修改的字符串对象,改变的是只是新的对象,而StringBuffer是可以修改的。
String非线程安全,StringBuffer线程安全

至于为什么还有string这个东西呢,我个人理解的是为了减少空间吧,如果说一个String a="aa" String b="aa" 不管有没有b,内存的占用一样的。 以上纯属个人理解。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
你可以看下String类的定义.他是final修饰的.也就是不可变数据类型.每次给String的对象赋值时,都是在堆区新分配一块内存.将原来String的值和后来修改后的值重新添加到这个新的内存地址上面去.再将该String对象引用到新分配的内存地址上.String是没有缓冲概念的.而StringBuffer在API的定义上没有使用final.也就是可变数据类型.StringBuffer对象修改值的话只会将引用在堆区的对象的值修改就行了.不回分配新的内存.你可以新建两个对象.分别是Stirng和StringBuffer的.然后赋值打印该对象的HashCode.然后再将该对象的值修改再打印他们的HashCode.String类型的HashCode会发生变化.而StringBuffer是不会变得.{:soso_e179:}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
①String对象内容是不可改变的,StringBuffer是可以改变的,并且高效;

② String
String a = "123";
a = a + "456";
上面两句,虽然a的值最终改变了,但是实际上在编译的时候,第一句a是一个对象,被分配了一个地址,第二句执行时,原来的a被释放,然后重新分配。
a 原本指向一 String object instance ("123"), a + "456" 会造出另一新的 String object instance ("123456"), 然后 a 再指向这新的 String instance.

③StringBuffer
StringBuffer b = new StringBuffer("asd");
b.append("fgh");
在这个过程中,只存在b这么一个对象,b 一直都指向一个 StringBuffer instance. append 也只是改变此 instance 的內容而已.
回复 使用道具 举报
这个,你可以这么理解,哥们,当大家还都在用NOKIA的时候,突然出现了一个Android出来了,大家都知道安卓用得不是很好..但是nokia手机依然还有啊? 很多东西,都是改进后才发觉的..一开始是不可能做到最先进的..比较偏一点的比方啦...个人意见,哈哈...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马