java字符串常量池 编译_Java字符串常量池,源码编译

Java代码:

public class Test // 从Object类继承

{

public static void main(String[] args)

{

String str = "a"+"b"+"c"+"d"+"e";

String stra0 = new String("aaabbb");

String stra1 = new String(str);

StringBuilder strb1 = new StringBuilder("aaaabbbb").append("cccc");

String str1 = "aa";

String str2 = "bb";

String str3 = "cc";

String stra = str1+str2+str3;

}

}

编译class后的字节码:

G:\>javap -c Test

Compiled from "Test.java"

public class Test {

public Test();

Code:

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

public static void main(java.lang.String[]);

Code:

0: ldc #2 // String abcde

2: astore_1

3: new #3 // class java/lang/String

6: dup

7: ldc #4 // String aaabbb

9: invokespecial #5 // Method java/lang/String."":(Ljava/lang/String;)V

12: astore_2

13: new #3 // class java/lang/String

16: dup

17: aload_1

18: invokespecial #5 // Method java/lang/String."":(Ljava/lang/String;)V

21: astore_3

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

25: dup

26: ldc #7 // String aaaabbbb

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

31: ldc #9 // String cccc

33: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

36: astore 4

38: ldc #11 // String aa

40: astore 5

42: ldc #12 // String bb

44: astore 6

46: ldc #13 // String cc

48: astore 7

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

53: dup

54: invokespecial #14 // Method java/lang/StringBuilder."":()V

57: aload 5

59: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

62: aload 6

64: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

67: aload 7

69: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

72: invokevirtual #15 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

75: astore 8

77: return

}

总结:

1、String str = "a"+"b"+"c"+"d"+"e"; 会在编译阶段生成abcde并放到字符串常量池中,不会分别生成a b c d e

2、String stra0 = new String("aaabbb"); 先把字符串aaabbb放到常量池中,再生成该值为aaabbb的String对象

3、字符串用"+"相加时会编译成StringBuilder对象并调用append()方法(注意:如果放到for循环中,可能会在for循环内new StringBuilder(),这个就是String相加速度慢的原因)。

4、放在“”双引号中的字符串都会保证到字符串常量池中,两个字符串用append()相加产生的中间缓存数据和结果结果都不会放到字符串常量池中,加号+相加产生的中间缓存数据和结果结果都会放到字符串常量池中

参考:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值