黑马程序员技术交流社区

标题: java基础,APIString型的判断。求大神。 [打印本页]

作者: 岳鹏    时间: 2016-9-1 19:11
标题: java基础,APIString型的判断。求大神。
        String s4 = "你";
                String s5 = "好吗";
                System.out.println("你好吗" == (s4 + s5));
               
                String s8 = "你好吗";
                String s6 = "你";
                String s7 = "好吗";
                System.out.println(s8 == (s6 + s7));

                String s1 = "ab";
                String s2 = "ab" + "c";
                System.out.println("abc" == s2);

结果是啥,为什么?
作者: 小超超    时间: 2016-9-1 20:14
共同学习下
作者: gcno93    时间: 2016-9-1 20:35
自己把代码贴到编译器测测!
作者: obvilion    时间: 2016-9-1 20:51
前两个为false
最后的为true
这是因为JVM中的常量优化机制和==号的性质共同导致的
==号两端若是引用数据类型则比较的是地址值
基本数据类型则是比较数据值
先说最后的
String s2 = "ab" + "c";
在做赋值操作时;
此时JVM会创建一个new String("abc"),并将其放入方法区的常量池中
将常量池中的地址值赋给s2;
System.out.println("abc" == s2);
在调用时会先看常量池中是否有"abc",有的话就会将常量池中的地址值放入==号左端;
所以==号左右两端地址值相同就返回了true.
至于前两个
由于==号右边都是两个变量相加,在做运算时不会在常量池中去找,而是直接创建新的对象,新创建的对象的地址值和常量池中的地址值必然不同,所以返回false




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2