String 常量池的一些注意事项

我们都应该知道,new出来的对象会放在堆中分配空间,String 也是一样:String s = new String("s");
而String直接引用的值都放在常量池中,但对String类型的“+”运算值得弄清楚:

public static void test1() {
String s = "ab";
String a = "a" + "b";
System.out.println(s == a);//这里 true。
}

JVM对字符串常量的"+"运算,在编译期完成。在常量池中的值赋给各个变量的引用!在编译期即把字符串常量的值确定下来!

public static void test2() {
String s = "ab";
String a = "a";
String b = a + "b";
System.out.println(s == b);//这里 false;
}

JVM对字符串引用的“+”运算,如果有字符串引用的存在,在编译期无法确定引用的值指向。只有在程序运行期通过动态分配并将链接后的地址赋予。 如果String a = "a" 换成 final String a = "a"那么返回的就是true。有了final修饰后,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中,所以和"a" + "b"是相同的效果!
注意 只有在编译期确定下来相同的值后方能 == 。这里的操作都在常量池中进行!不同于new出来的String !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值