String和字符串常量池

所说的字符串常量池也是常量池中的一部分。

String str = "abc";

先检查字符串常量池是否存在对象"abc",

如果不存在,则在字符串常量池创建对象"abc",栈中的引用str再指向对象"abc"的地址;

如果存在,栈中的引用str直接指向对象"abc"的地址;

String str1 = "a" + "bc";
其中,"a"和"bc"都是字符串常量,所以编译器在编译字节码时,就优化成"ab",所以"ab"也是字符串常量;

str == str1 ,结果:true;

String str2 = new String("abc");
先检查字符串常量池是否存在对象"abc",

如果不存在,则在字符串常量池创建对象"abc",再在堆中创建对象new String("abc"),栈中的引用str指向堆里的对象String("abc")的地址,这种情况创建两个对象;

如果存在,在堆中创建对象new String("abc"),栈中的引用str指向堆里的对象String("abc")的地址,这种情况创建一个对象;

String str3 = "a" + new String("bc");
由于new String("bc")不是字符串常量,所以编译器在编译时期不能对它进行优化,创建对象"a","bc",再用(java5)StringBuilder调用append()连接"a","bc",最后调用StringBuilder的toString()创建对象"abc",引用str2指向的是新创建对象"abc"。

str2 == str3,结果:false



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值