String.append在java中

时间:2015-03-05 23:37:42

标签: java string

    String someString = "text";
    someString.append("0").append("1");

所以,我在一些实际工作的代码中看到了这一点(很清楚它是一个有效的实现)。 这让我想知道这些东西是如何实际运作的。我完全了解了具有嵌套指针的指针,但事实并非如此。 它是在编译第一个附加,说是一个字符串,然后再次编译?

2 个答案:

答案 0 :(得分:0)

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

真正的代码可能正在使用StringBuilder

StringBuilder someString = new StringBuilder("someString");
someString.append("a").append("b");

关于该方法的工作原理:

  

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

     

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

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

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

   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;

答案 1 :(得分:0)

如前所述,String类在Java中没有方法append。但是,StringBuilder有一个:http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#append(java.lang.String)

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

为了简化,该方法可能在这些方面的某处实现:

public StringBuilder append(String s) {
    // do something with s

    return this;
}

这有时称为Fluent interface