java字符串常量 ==_java字符串常量问题

网上看到的一篇文章讲的字符串常量。其它没什么问题,主要是

str7 == str8 的值为false,表示这个不理解,还望达人们能指点一下。如果能从引用(or地址?)的创建、改变的角度谈谈则再好不过了。

先行谢过~

代码如下(代码已经被我简化过了,只保留有疑问部分):

public class DemoStringCreation {

public static void main(String args[]) {

String s = "lo";

String str7 = "Hel" + s;

String str8 = "He" + "llo";

System.out.println(" str7 == str8 is " + (str7 == str8));

System.out.println(" str7.equals(str8) is " + str7.equals(str8));

}

}

/******************************* updated 2014.04.18 14:40 ********************/

@brayden 大大从编译的角度给出了解释,我相信这个解释足够底层、根本,无奈我看不太明白

-_-!!

这篇文章最下面几段给了解释,理解起来似乎有了些感觉。示例代码与相应的解释我也贴一下,

/****************粘贴开始******************/

String a = "ab";

String bb = "b";

String b = "a" + bb;

System.out.println((a == b)); //result = false

分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。

String a = "ab";

final String bb = "b";

String b = "a" + bb;

System.out.println((a == b)); //result = true

分析:和上面例子唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量 池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。

String a = "ab";

final String bb = getBB();

String b = "a" + bb;

System.out.println((a == b)); //result = false

private static String getBB() {

return "b";

}

分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面 程序的结果为false。

/****************粘贴结束******************/

Ok,这里我的新问题又来了,什么时候是编译期,什么时候是才算是运行期呢?(问题是不是太基础了?我自己都怀疑……装载、编译、运行这些概念是经常碰到,就是从来没有完全弄清楚过程)如果这个问题解决了,那按照上面贴的这篇文章里的解释,就能完全理解通了。或者,能不能把@brayden大大的那个编译解释明白一点点?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值