我们学习Java的时候,常常看到String的字样,我们都知道String是一个引用类型的字符串类型,且一但初始化就不可更改,由于这个特性,每次对String的每次改变,都会返回一个新的String对象,等于是创建了一个新的字符串。如此,如果对字符串每次进行拼接操作,就会在堆内存中的常量池中新开辟一个内存区间,比如如下代码:
public static void main(String[] args) {
String s = "abc";
s += "def";
System.out.println(s);
}
我首先用String在栈中创建了变量s,并赋值为“abc”,变成字符串对象保存在堆内存中,然后我又把字符串对象进行拼接,最后输出了abcdef。需要注意的是,在拼接过程中,计算机不是将堆内存中的常量池的区间“abc”修改为了区间“abcdef”,而是在堆内存中先开辟了一块区间存放字符串cde,然后再开辟一块区间,存放拼接完的字符串“abcdef”,可见,这样子既费时又浪费空间,所以可以用StringBuilder构造方法来创建对象。如下
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("abc");
System.out.println(sb1);
用StringBuilder来创建对象时,由于它是一个可变的字符串类型,我们可以把它看作一个容器,丢什么进去就有什么,如果要进行字符串拼接,不会在堆中另开辟空间来创建一个新的对象,既省时又省空间。