黑马程序员技术交流社区

标题: String和StringBuffer的小问题? [打印本页]

作者: 昝文萌    时间: 2013-9-4 18:31
标题: String和StringBuffer的小问题?
本帖最后由 昝文萌 于 2013-9-5 12:09 编辑

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

作者: 武嘉豪    时间: 2013-9-4 18:38
String是不可以修改的字符串对象,改变的是只是新的对象,而StringBuffer是可以修改的。
String非线程安全,StringBuffer线程安全

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


作者: Development...    时间: 2013-9-4 18:44
你可以看下String类的定义.他是final修饰的.也就是不可变数据类型.每次给String的对象赋值时,都是在堆区新分配一块内存.将原来String的值和后来修改后的值重新添加到这个新的内存地址上面去.再将该String对象引用到新分配的内存地址上.String是没有缓冲概念的.而StringBuffer在API的定义上没有使用final.也就是可变数据类型.StringBuffer对象修改值的话只会将引用在堆区的对象的值修改就行了.不回分配新的内存.你可以新建两个对象.分别是Stirng和StringBuffer的.然后赋值打印该对象的HashCode.然后再将该对象的值修改再打印他们的HashCode.String类型的HashCode会发生变化.而StringBuffer是不会变得.{:soso_e179:}
作者: 刘乃宽    时间: 2013-9-4 20:31
①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 的內容而已.

作者: lonely_zb    时间: 2013-9-4 20:55
这个,你可以这么理解,哥们,当大家还都在用NOKIA的时候,突然出现了一个Android出来了,大家都知道安卓用得不是很好..但是nokia手机依然还有啊? 很多东西,都是改进后才发觉的..一开始是不可能做到最先进的..比较偏一点的比方啦...个人意见,哈哈...




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