java中的String.append

java中的String.append,java,string,Java,String,因此,我在一些实际工作的代码中看到了这一点(很明显,这是一个有效的实现)。 这让我想知道这东西到底是怎么工作的。我完全理解指针具有嵌套指针的概念,但事实似乎并非如此。 是不是编译第一个append,说那是一个字符串,然后再编译?这个string类没有任何append方法,所以我非常怀疑这是您真正看到的代码 真正的代码可能使用了 至于该方法的工作原理: 将指定的字符串追加到此字符序列。这个 字符串参数的字符按递增顺序追加 此序列的长度乘以参数的长度。如果str是 null,然后附加四个字符“nul

因此,我在一些实际工作的代码中看到了这一点(很明显,这是一个有效的实现)。 这让我想知道这东西到底是怎么工作的。我完全理解指针具有嵌套指针的概念,但事实似乎并非如此。
是不是编译第一个append,说那是一个字符串,然后再编译?

这个
string
类没有任何
append
方法,所以我非常怀疑这是您真正看到的代码

真正的代码可能使用了

至于该方法的工作原理:

将指定的字符串追加到此字符序列。这个 字符串参数的字符按递增顺序追加 此序列的长度乘以参数的长度。如果str是 null,然后附加四个字符“null”

设n为执行前该字符序列的长度 append方法的。然后在新的 字符序列等于旧版本中索引k处的字符 字符序列,如果k小于n;否则,它等于 参数str中索引k-n处的字符

append
方法返回对对象的引用,这就是为什么可以将调用链接到
append

现在要回答您关于编译器真正做什么的问题,让我们看看生成的字节码:

StringBuilder someString = new StringBuilder("someString");
someString.append("a").append("b");
0:new#2//class java/lang/StringBuilder
3:dup
4:ldc#3//String someString
6:invokespecial#4//方法java/lang/StringBuilder。”“:(Ljava/lang/String;)V
9:astore_1
10:aload_1
11:ldc#5//字符串a
13:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16:ldc#7//字符串b
18:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

正如前面所说,
String
类在Java中没有方法
append
。但是,
StringBuilder
有一个:

正如您在javadoc中看到的,这些方法返回一个指向自身的指针,因此,您可以对返回的内容调用任何方法

为了简化,该方法可能在以下方面实施:

   0: new           #2                  // class java/lang/StringBuilder
   3: dup
   4: ldc           #3                  // String someString
   6: invokespecial #4                  // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   9: astore_1
  10: aload_1
  11: ldc           #5                  // String a
  13: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  16: ldc           #7                  // String b
  18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

这有时被称为

Java语言中没有为
String
定义的
append()
方法。不,由于azurefrog提供的原因,它不起作用。String是否有
append()
方法?或者您正在使用
StringBuffer
/
StringBuilder
   0: new           #2                  // class java/lang/StringBuilder
   3: dup
   4: ldc           #3                  // String someString
   6: invokespecial #4                  // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   9: astore_1
  10: aload_1
  11: ldc           #5                  // String a
  13: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  16: ldc           #7                  // String b
  18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
public StringBuilder append(String s) {
    // do something with s

    return this;
}