从内存方面解析String与StringBuffer的区别

何为Buffer? 英文单词Buffer是缓冲区的意思,什么叫缓冲区? 皇妃要洗澡,浴池里要有花瓣和温度适中的水,水怎么来的?肯定是一桶一桶往里倒的啊!先把用锅烧的水一瓢一瓢的倒到桶里,再把桶里的水倒进皇妃娘娘的浴池里~在这里,这个桶就是缓冲区。String为不可变类型,而StringBuffer为可变类,为什么它可变呢?这就是缓冲区的神奇了。
先看代码:
String s1 = "Hello";
String s2 = "World";
s1 += s2;

datasegment中存String与static类型的变量,栈内存中存储所有局部变量。

前两行代码执行时,在datasegment中开辟出两块空间来分别储存“Hello“和”World”,而在栈内存中分配两块空间来储存s1与s2,这两块内存空间并不储存s1与s2的实际内容,它们储存的是s1和s2的引用,或者用稍微不严谨的说法来说,它们储存的是分别指向datasegment中“Hello“”World”两块内容的物理地址。

当代码执行到第三行,怎么执行的?你可能会说,datasegment中的“World”加到了“Hello”的后边,然后s1再指向“HelloWorld”,而s2则因为不再指向别的内容只剩下一个引用而被java的垃圾回收机制回收,这是我们最直接的想法,但事实并不是这样,因为String为非可变类,所以它不能这么来。

在实际当中是这样的,当代码执行到第三行的时候,在datasegment中又开辟出了一块新的空间,“Hello”首先赋值进来,“World”紧跟在后,形成一个新的“HelloWorld”,然后再让s1指向这个新的空间,至于栈内存中的s2引用与datasegment中原来储存“Hello”与“World”两个内容的两块空间则因为缺失了自己的另一半而被java垃圾回收机制所幻化的黑白无常拉进地狱永世不得不超生了~所以说句题外话,赶紧找个女朋友吧!毕竟,我们是面向对象编程,没有对象,还编毛程!嘎嘎嘎~~~咳,至于StringBuffer,人家是可变类,所以人家可以用上述的第一种机制来完成字符串的加运算,这种方法无疑效率会更高。因此,小结一下,StringBuffer是可变类,所以它在对字符串的变化的处理上比String类更为便捷,高效一些。

---------一篇很久前写的博文,粗浅不足之处还望指正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请保持优秀。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值