您的位置:首页 > Web前端

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

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

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

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

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

String类的对象与其他字符串拼接之后,其指向就会发生变化,在常量池中产生垃圾。而StringBuffer类对象则不会,它将字符串改变之后仍然在原地址,原先指向这个地址的数据会随之变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: