Java String

给出Java中String的常见操作,并给出字节码分析结果

  public static voidfun1(){

//首先在常量池中查找abc这个字符串,如果存在则不会新建,直接引用常量池中已经存在的String

Stringstr1 = "abc";

Stringstr2 = "abc";

System.out.println(str1==str2);//returntrue

}

publicstatic void fun2(){

Stringstr1 = "abc";

String str2 ="ab"+"c";//在编译过程中优化为str2="abc"

System.out.println(str1==str2);//returntrue

}

publicstatic void fun3(){

Stringstr1 = "abc";

Stringstr2 = "ab";

Stringstr3 = "c";

Stringstr4 = str2+str3;//会构建一个新的字符串abc,str4应用该地址,所以return false

System.out.println(str1==str4);//returnfalse

System.out.println(str1.equals(str4));//returntrue

}

字节码如下:

  public staticvoid fun1();

    Code:

       0: ldc           #22                 // String abc

       2: astore_0

       3: ldc           #22                 // String abc

       5: astore_1

       6: getstatic     #24                 // Fieldjava/lang/System.out:Ljava/

io/PrintStream;

       9: aload_0

      10: aload_1

      11: if_acmpne     18

      14: iconst_1

      15: goto          19

      18: iconst_0

      19: invokevirtual #30                 // Methodjava/io/PrintStream.printl

n:(Z)V

      22: return

 

  public static void fun2();

    Code:

       0: ldc           #22                 // String abc

       2: astore_0

       3: ldc           #22                 // String abc

       5: astore_1

       6: getstatic     #24                 // Fieldjava/lang/System.out:Ljava/

io/PrintStream;

       9: aload_0

      10: aload_1

      11: if_acmpne     18

      14: iconst_1

      15: goto          19

      18: iconst_0

      19: invokevirtual #30                 // Methodjava/io/PrintStream.printl

n:(Z)V

      22: return

 

  public staticvoid fun3();

    Code:

       0: ldc           #22                 // String abc

       2: astore_0

       3: ldc           #43                 // String ab

       5: astore_1

       6: ldc           #45                 // String c

       8: astore_2

       9: new           #47                 // classjava/lang/StringBuilder

      12: dup

      13: aload_1

      14: invokestatic  #49                 // Methodjava/lang/String.valueOf:(

Ljava/lang/Object;)Ljava/lang/String;

      17: invokespecial #53                 // Methodjava/lang/StringBuilder."<

init>":(Ljava/lang/String;)V

      20: aload_2

      21: invokevirtual #56                 // Methodjava/lang/StringBuilder.ap

pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;

      24: invokevirtual #60                 // Methodjava/lang/StringBuilder.to

String:()Ljava/lang/String;

      27: astore_3

      28: getstatic     #24                 // Fieldjava/lang/System.out:Ljava/

io/PrintStream;

      31: aload_0

      32: aload_3

      33: if_acmpne     40

      36: iconst_1

      37: goto          41

      40: iconst_0

      41: invokevirtual #30                 // Methodjava/io/PrintStream.printl

n:(Z)V

      44: getstatic     #24                 // Fieldjava/lang/System.out:Ljava/

io/PrintStream;

      47: aload_0

      48: aload_3

      49: invokevirtual #64                 // Methodjava/lang/String.equals:(L

java/lang/Object;)Z

      52: invokevirtual #30                 // Methodjava/io/PrintStream.printl

n:(Z)V

      55: return

}


String str4 =str2+str3;//在字节码中出现了StringBuilder所以String的加操作在底层是被解释为StringBuilder来操作的,用append来进行加操作


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值