日期:2014-05-20  浏览次数:20723 次

字符串比较,是我错了还是eclipse错了
Java code
    String str1="Andy";

        String str2=str1;

        if(str1 == "Andy"){
            System.out.println("str1,str2的地址相等");
        }
        if(str1.equals("Andy")){
            System.out.println("str1,str2值相等");
        } 



str1 == "Andy"应该是true吧,而且也确实输出结果了。
但是debug模式下却显示str1 == "Andy"为false,是我错了还是eclipse错了?

------解决方案--------------------
这个不是断点 不断点的关系
当 str1=="Andy" 作为表达式输出的时候 就是 FASLE
Eclipse 会在内存里重新申请一个空间来做为常量的存贮
所以编辑的时候走的是TRUE 放在表达式监控的时候就成了FALSE
------解决方案--------------------
其实简单一点 就是说 你用IDE 去看一些表达式~~应该都是IDE处理过的~·
然而他再计算某些表达式的时候 例如str1=="Andy" str1 他会去内存找到这个变量 而"Andy"像这种 他不会像编译器一样做优化处理 而是直接去内存里生成了。所以JVM的内存空间 跟IDE 的内存空间是两个概念
------解决方案--------------------
idea也是这样的 输出为true但是debug为false
------解决方案--------------------
用IDE看到的DEBUG 不是真正编译器在跑的东西 这是有一点点区别的~~
------解决方案--------------------
当 str1=="Andy" 作为表达式输出的时候 就是 FASLE
Eclipse 会在内存里重新申请一个空间来做为常量的存贮
所以编辑的时候走的是TRUE 放在表达式监控的时候就成了FALSE

------解决方案--------------------
探讨

当 str1=="Andy" 作为表达式输出的时候 就是 FASLE
Eclipse 会在内存里重新申请一个空间来做为常量的存贮
所以编辑的时候走的是TRUE 放在表达式监控的时候就成了FALSE

------解决方案--------------------
我觉得在debug模式下,每次用“abc”这个字符串都是要申请内存的(每次的abc都不同)
直接运行的话,编译器会对源码进行一定程度的优化,那么字符串"abc"可能就是使用的同一内存中的内容,而不是每次都要申请内存(只有一个abc)
。。。猜测。。。
------解决方案--------------------
1 永远记得equals和==的区别
2 String常量池依据jvm不同,可能会不同
3 就你的问题而言,debug的expression,str从栈中获取,但是那个"Andy",却是一个eclipse生成的新的常量。所以false了