相信大家都有用过String和StringBuffer吧,但是具体两者之间有什么区别呢?
其实很简单,就一个区别,那就是String声明之后的值是不可修改的,而StringBuffer是可以修改的。
这个时候应该会有反对意见了吧,因为会说String定义之后的值是可以修改的,如下
public class Test{ public static void main(String args[]){ String str="hello "; str+="world!!"; System.out.println(str); } } |
通过以上的代表进行编译之后,会发现出现的结果是:
hello world!! |
很明显,这个时候String中的值就已经改变了,但这只是显示的值改变了,堆中的数值是否改变了呢?请看下图:
其实String也是一个类,里面也存在着自己的构造方法,然而当我们用String str=“hello”的时候,定义的”hello”就相当于一个匿名对象,所以一开始会在栈中定义一个str对象,并在堆中开辟一个空间,存放“hello”,当我们执行到str+=“world”的时候,出现了“world”,所以堆中会开辟一个新的空间来存放“world”,而通过“+”连接成的新的字符串“hello world”也是一个匿名对象,所以也会在堆中开辟一个空间来存放,而这个时候str已经执行了“hello world”了,根据一个栈对象不能同时指向两个堆内存空间,所以str要断开与“hello”的连接,重新指向“hello world”,所以这个时候在控制台输出的时候就会输出“hello world”了。
但是大家仔细想想,这个时候原来的“hello”的值改变了吗?明显是没有的,而只是str的地址指向改变了。而且如果“hello”和“world”没有新的引用的话,就会被垃圾回收机制回收。
所以说,String的定义之后的值是不会改变的,而StringBuffer通过append()或者其他方法是可以改变的。
在开发中,应该尽量避免如下的操作
public static void main(String args[]){ String str="hello "; for(int i=0;i<100;i++){ str+=i; } System.out.println(str); } |
因为即使能完成自己想要的功能,但是在堆中是要断开100次连接的,这样的操作性能是很低的。
String和StringBuffer的区别,布布扣,bubuko.com
原文:http://www.cnblogs.com/littleQin/p/3630696.html