在学习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()方法