java字符串常量问题

网上看到的一篇文章讲的字符串常量。其它没什么问题,主要是
str7==str8的值为false,表示这个不理解,还望达人们能指点一下。如果能从引用(or地址?)的创建、改变的角度谈谈则再好不过了。
先行谢过~
代码如下(代码已经被我简化过了,只保留有疑问部分):
publicclassDemoStringCreation{
publicstaticvoidmain(Stringargs[]){
Strings="lo";
Stringstr7="Hel"+s;
Stringstr8="He"+"llo";
System.out.println("str7==str8is"+(str7==str8));
System.out.println("str7.equals(str8)is"+str7.equals(str8));
}
}
/*******************************updated2014.04.1814:40********************/@brayden大大从编译的角度给出了解释,我相信这个解释足够底层、根本,无奈我看不太明白
-_-!!这篇文章最下面几段给了解释,理解起来似乎有了些感觉。示例代码与相应的解释我也贴一下,/****************粘贴开始******************/
Stringa="ab";
Stringbb="b";
Stringb="a"+bb;
System.out.println((a==b));//result=false
分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a"+bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。
Stringa="ab";
finalStringbb="b";
Stringb="a"+bb;
System.out.println((a==b));//result=true
分析:和上面例子唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。所以此时的"a"+bb和"a"+"b"效果是一样的。故上面程序的结果为true。
Stringa="ab";
finalStringbb=getBB();
Stringb="a"+bb;
System.out.println((a==b));//result=false
privatestaticStringgetBB(){
return"b";
}
分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面程序的结果为false。/****************粘贴结束******************/
Ok,这里我的新问题又来了,什么时候是编译期,什么时候是才算是运行期呢?(问题是不是太基础了?我自己都怀疑……装载、编译、运行这些概念是经常碰到,就是从来没有完全弄清楚过程)如果这个问题解决了,那按照上面贴的这篇文章里的解释,就能完全理解通了。或者,能不能把@brayden大大的那个编译解释明白一点点?
千万里不及你
浏览 289回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript