String someString = "text";
someString.append("0").append("1");
所以,我在一些实际工作的代码中看到了这一点(很清楚它是一个有效的实现)。 这让我想知道这些东西是如何实际运作的。我完全了解了具有嵌套指针的指针,但事实并非如此。 它是在编译第一个附加,说是一个字符串,然后再次编译?
答案 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