介绍
小编给大家分享一下在java中字符串对“+”的用法,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
下面有段简单的代码
公共类StringPlusTest { 公共静态void main (String [] args) { 字符串s1=癮aa"; 字符串s2=癰bb"; 字符串s=癱cc"+ s1 + s2 +“ddd"; }}
使用<代码> \ StringPlusTest javap - c。类> 代码反编译一下,得到
编制从“StringPlusTest.java" com.epoint.codetuning.test公共类。StringPlusTest { 公共com.epoint.codetuning.test.StringPlusTest (); 代码: 0:aload_0 1: invokespecial # 1//java/lang/对象方法!”& lt; init>“: V () 4:返回 公共静态void main(以[]); 代码: 0:ldc # 2//字符串aaa 2:astore_1 3: bbb ldc # 3//字符串 5:astore_2 6:新# 4//java/lang/StringBuilder类 9:dup 10: invokespecial # 5/java/lang/方法/StringBuilder !”& lt; init>“: V () 13:ldc # 6//字符串ccc 15:invokevirtual # 7//java/lang/StringBuilder.append:方法(Ljava/lang/String;) Ljava/lang/StringBuilder; 18:aload_1 19: invokevirtual # 7//java/lang/StringBuilder.append:方法(Ljava/lang/String;) Ljava/lang/StringBuilder; 22:aload_2 23: invokevirtual # 7//java/lang/StringBuilder.append:方法(Ljava/lang/String;) Ljava/lang/StringBuilder; 26日:ldc # 8//ddd字符串 28:invokevirtual # 7//java/lang/StringBuilder.append:方法(Ljava/lang/String;) Ljava/lang/StringBuilder; 31日:invokevirtual # 9//java/lang/StringBuilder.toString方法:()Ljava/lang/String; 34:astore_3 35:返回}
其中,
ldc把常量池中的项压入栈 astore_1将引用类型或returnAddress类型值存入局部变量1 astore_2将引用类型或returnAddress类型值存入局部变量2 新的创建一个新对象 dup复制栈顶部一个字长内容 invokespecial根据编译时类型来调用实例方法 aload_1从局部变量1中装载引用类型值 aload_2从局部变量2中装载引用类型值 astore_3将引用类型或returnAddress类型值存入局部变量3
对于Java来说,这段代码原理上应该是:
公共类StringPlusTest { 公共静态void main (String [] args) { 字符串s1=癮aa"; 字符串s2=癰bb"; 字符串s=新StringBuilder () .append (“ccc") .append (s1) .append (s2) .append (“ddd") .toString (); }}
由此可见,Java中使用“+”拼接字符串的实现原理是通过建立临时StringBuilder对象调用附加和toString方法实现。
对上面代码做一些修改
公共类StringPlusTest { 公共静态void main (String [] args) { 字符串s1=癮aa"; 字符串s2=零; 字符串s=癱cc"+ s1 + s2 +“ddd"; System.out.println(年代); }}
结果是什么?
运行可以得到如下:
cccaaanullddd
查看StringBuilder源码
@Overridepublic StringBuilder append (String str) { super.append (str); 返回;}
该方法调用继承父类AbstractStringBuilder的方法,再去父类中查看
在java中字符串对“+“的用法