个人理解Java中String与StringBuffer类的区别

Java中的String类有一个常量池,会将出现的字符串常量加入到其中,这个常量池不同与堆与栈,是属于一个静态的区域,在方法区中。

String s1 = new String("abc"); 与String s2 = "abc"; 是不同的效果。

前者其实是三步操作:首先:编译时知道一个字符串常量abc,如果代码第一次出现,则常量池中没有这个常量,就会在常量池中分配空间存储abc。第二步:在堆中分配一个空间用来存储一个字符串变量,用来指示到常量池新空间的物理地址。 第三步是在栈中开辟空间存储局部变量s,将其值置为堆中空间的物理地址。因此s1此时的值是堆空间中的物理地址。

后者是两步操作:第一步与前者相同,在常量池中创建空间。而第二步就是最后一步:在栈中创建空间,直接指向(为栈中的变量赋值)常量池新空间。因此此时s2的值是常量池新空间的物理地址。与堆空间中的地址值当然不同。

String类的对象与其他字符串拼接之后,其指向就会发生变化,在常量池中产生垃圾。而StringBuffer类对象则不会,它将字符串改变之后仍然在原地址,原先指向这个地址的数据会随之变化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值