黑马程序员技术交流社区
标题:
求助,为什么这俩个表达式结果不一样
[打印本页]
作者:
陈圳
时间:
2013-5-2 15:05
标题:
求助,为什么这俩个表达式结果不一样
本帖最后由 陈圳 于 2013-5-2 17:13 编辑
public Test{
public static void main(String[] args){
Stirng hello="Hello",lo="lo";
System.out.println((hello==("Hel"+"lo"))+" ");
System.out.println((hello==("Hel"+lo))+" ");
}
复制代码
为什么结果会有差异?请高人分析运行过程
作者:
wudongzhe
时间:
2013-5-2 15:08
System.out.println((hello==("Hel"+"lo"))+" ");//在stringpool创建的常量,在编译期就已经确定
System.out.println((hello==("Hel"+lo))+" ");//lo要在运行期才能确定,而且是在堆中创建
作者:
陈圳
时间:
2013-5-2 15:50
张熙韬 发表于 2013-5-2 15:31
陈圳童鞋有问题,太难得了,这个必须挤时间交流下!先占座,后答题!
没啥...The Java® Language Specification 3.10.5. String Literals 里面的示例...我文化低,看不懂英文...
作者:
殇_心。
时间:
2013-5-2 16:01
第一句: “hel” + "lo" 。在编译时期就可以确定下来。直接引用常量池中的"hello"
第二句:“hel”+lo。 由于lo是普通变量,编译器不会执行宏替换。
所以不能在编译器时期确定下来。不能直接引用常量池中的"hello"
如果lo这样定义: final String lo = "lo" 的话。 这样编译器就会执行宏替换。
就引用常量池中的"hello"。结果也就是输出true。
作者:
余威宏
时间:
2013-5-2 20:24
本帖最后由 余威宏 于 2013-5-2 20:28 编辑
首先,==的作用是比较对象的值是否相等,如果相等返回true,否则返回false;当两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否一致,如果同时指向同一地址,则返回true,否则返回false.
第一句 Stirng hello="Hello",lo="lo"; // 在string pool中产生了 hello,lo 这样的常量字符串。
第二句 System.out.println((hello==("Hel"+"lo"))+" "); //左边是变量hello=“hello”,由于右边"Hel"+"lo"加号连接起来后为"hello" ,所以左边跟右边两个都指向了String pool中"hello" ,指向的为同一个对象。打印结果为trule。
第三句 System.out.println((hello==("Hel"+lo))+" "); //这个由于右边"Hel"+lo 中有个变量lo,这个时候一个是String pool中的对象,一个为堆中的对象,它们所指向的对象不同。 打印结果为false。
希望我的回答能让楼主明白。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2