个人理解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类对象则不会,它将字符串改变之后仍然在原地址,原先指向这个地址的数据会随之变化。
String s1 = new String("abc"); 与String s2 = "abc"; 是不同的效果。
前者其实是三步操作:首先:编译时知道一个字符串常量abc,如果代码第一次出现,则常量池中没有这个常量,就会在常量池中分配空间存储abc。第二步:在堆中分配一个空间用来存储一个字符串变量,用来指示到常量池新空间的物理地址。 第三步是在栈中开辟空间存储局部变量s,将其值置为堆中空间的物理地址。因此s1此时的值是堆空间中的物理地址。
后者是两步操作:第一步与前者相同,在常量池中创建空间。而第二步就是最后一步:在栈中创建空间,直接指向(为栈中的变量赋值)常量池新空间。因此此时s2的值是常量池新空间的物理地址。与堆空间中的地址值当然不同。
String类的对象与其他字符串拼接之后,其指向就会发生变化,在常量池中产生垃圾。而StringBuffer类对象则不会,它将字符串改变之后仍然在原地址,原先指向这个地址的数据会随之变化。
相关文章推荐
- java堆 、栈学习(深刻理解String s=new String("xoxo")和String s=" xxoo"的区别)
- java中char和String个人理解
- Java中String、StringBuffer、StringBuilder区别与理解
- 个人对Java中String对象的传递的理解(错误之处,请给与纠正,
- 从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别
- JAVA的String、StringBuilder和StringBuffer类的区别
- Java中String、StringBuffer、StringBuilder区别与理解
- 从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别
- Java软件低级错误(二十 ):正确理解String/StringBuffer/StringBuilder的性能区别
- Java中String、StringBuilder和StringBuffer类的区别
- String == 和 equals 的区别的个人理解
- 从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别
- 深刻理解Java中的String、StringBuffer和StringBuilder的区别
- java 的String, Stringbuffer, StringBuilder的区别以及对final关键字的理解
- Java中StringBuffer类和String的区别
- JAVA的String、StringBuilder和StringBuffer类的区别
- java堆栈区别(个人理解)
- 理解java String,深入解析StringBuffer和StringBuilder的区别
- JAVA的String、StringBuilder和StringBuffer类的区别
- 全面理解Java中的String数据类型