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;
}