在学习Java 的过程中发现 append 方法可以这样用,如下:
public static void main(String[] args) {
//创建空的字符串缓冲区
StringBuilder sb = new StringBuilder();
//添加数据(链式编程)
sb.append("Hello").append("World");
System.out.println(sb);
}
在append方法之后可以再跟一个 .append()
,根据代码格式推理,这意味着前面的整体 sb.append("Hello")
是一个对象
首先我们了解一下 StringBuilder (字符串缓冲区)类
- StringBuilder 是一个可变的字符序列,它内部存储的字符串数据是可变的
由于字符串的不可变性,在拼接字符串时,会产生大量的内存垃圾,使用 StringBuilder 类就可以解决这个问题。
当使用 append()追加数据到 StringBuilder 对象中,返回的是一个 StringBuilder 对象,也就意味着代码中的 sb.append("Hello")
整体是一个对象,所以可以使用 append 继续追加,下面我们通过 (ctrl + 鼠标左键) 来看一下底层代码
@Override
@HotSpotIntrinsicCandidate
public StringBuilder append(String str) {
super.append(str);
return this;
}
- 我们可以注意到,最后返回的是一个 this,而 this 就代表当前对象,对于 this 是这样描述的,哪个对象来调用它,它就代表谁,那么在此处就相当于我们在上面创建的字符串对象
sb
,然后通过 StringBuilder 类型来返回,所以调用方法的这一整块代码sb.append("Hello")
就相当于是 sb
那么它和使用 “+” 来拼接字符串有什么区别呢?
需要注意的是,在java中,String格式的数据是不可变类型的,例如下面的代码:
String str = "abc";
str += "d";
System.out.println(str); //打印结果 abcd
- 当我们执行以下代码时,结果为
aaa
,看起来是将str
的值 从abc
修改为了abcd
,但实际上是在内存中重新开辟了一块空间,然后存储一个abcd
重新赋值给了str
,而原来的abc
还是存在着,等待着GC(垃圾回收)来清理
这时候就会出现一种情况,因为我们每使用 “ + ” 拼接一次,程序都会内存中开辟一块空间来存储新的值,如果我们拼接了很多次的字符串,这时候内存中就会产生很多内存垃圾 - 而append 方法,只适用于 StringBuilder 类,同时通过 StringBuilder 创建出来的字符串对象是可变类型的,当我们使用 apend() 方法拼接字符串时,他会更改原有的数据,而不是重新开辟一块空间,这样就不至于浪费系统内存
所以建议在合适的场景下,若有大量的字符串需要拼接,优先考虑使用 append()方法