java字符和字符串的区别6,比较在Java中声明为Final的字符串和=

如果你看一下这个方法public void noFinal() {

String str1 = "str";

String str2 = "ing";

String concat = str1 + str2;

System.out.println(concat == "string");}public void withFinal() {

final String str1 = "str";

final String str2 = "ing";

String concat = str1 + str2;

System.out.println(concat == "string");}

和它的分解javap -c ClassWithTheseMethods你会看到的版本public void noFinal();

Code:

0: ldc           #15                 // String str

2: astore_1

3: ldc           #17                 // String ing

5: astore_2

6: new           #19                 // class java/lang/StringBuilder

9: dup

10: aload_1

11: invokestatic  #21                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;

14: invokespecial #27                 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V

17: aload_2

18: invokevirtual #30                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

21: invokevirtual #34                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

...

和public void withFinal();

Code:

0: ldc           #15                 // String str

2: astore_1

3: ldc           #17                 // String ing

5: astore_2

6: ldc           #44                 // String string

8: astore_3

...

因此,如果字符串不是最终编译器,则必须使用StringBuilder串连str1和str2所以String concat=str1+str2;

将被汇编成String concat = new StringBuilder(str1).append(str2).toString();

这意味着concat将在运行时创建,因此不会来自字符串池。

另外,如果字符串是最终的,那么编译器可以假设它们永远不会改变,而不是使用StringBuilder它可以安全地连接它的值String concat = str1 + str2;

可以更改为String concat = "str" + "ing";

并连成String concat = "string";

这意味着concate将被插入到字符串池中,然后将其与该池中的相同字符串文本进行比较。if声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值