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错了?

解决方案 »

  1.   

    你好好看看,debug可能你取的时机不对所以显示为false
      

  2.   

    断点 还在 28 line 还没有执行 28行代码。
      

  3.   

    重试了多次,在25行和26行都显示false,大家可以自己试试
      

  4.   

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

  5.   

    其实简单一点 就是说  你用IDE 去看一些表达式~~应该都是IDE处理过的~·
    然而他再计算某些表达式的时候 例如str1=="Andy" str1 他会去内存找到这个变量 而"Andy"像这种 他不会像编译器一样做优化处理 而是直接去内存里生成了。所以JVM的内存空间 跟IDE 的内存空间是两个概念
      

  6.   

    有点明白了~
    就是说debug查看的是IDE得出的表达式结果,可能也JVM的不一样;而运行是根据配置的JDK。是这个意思吧?
      

  7.   

    我想说的是 
    在我的机子上着2句都可以输出 
    就是说这2个都是true
      

  8.   

    忘记说了JDK1.6  2个都是true
      

  9.   

    idea也是这样的 输出为true但是debug为false
      

  10.   

    用IDE看到的DEBUG 不是真正编译器在跑的东西  这是有一点点区别的~~
      

  11.   

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

  12.   

    str1 == "Andy" 这样判断是不对的。字符串不能直接==的 
    if(str1.equals("Andy")){}
      

  13.   

    经 测试 !!  确实 两者 都为true!! 都能输出的!
      

  14.   

    表达式中的那个"abc"的内存地址会一直变动System.identityHashCode(str1);
    System.identityHashCode("abc");监视一下这2个表达式就知道了
      

  15.   

    表达式中的那个abc不是代码中的那个abc
      

  16.   

    没记错的话:
    因为String是引用型,所以它的变量存的是一个地址,你那样比的是两个引用的地址。
    但我之前也像你那样写,编译通过了,结果也是正确的,所以搞不懂了
      

  17.   

    我试了了第一个是false,第二十true的
      

  18.   

    其实这种问题挺无聊的,只要记住用equals就好了。
      

  19.   

    我觉得在debug模式下,每次用“abc”这个字符串都是要申请内存的(每次的abc都不同)
    直接运行的话,编译器会对源码进行一定程度的优化,那么字符串"abc"可能就是使用的同一内存中的内容,而不是每次都要申请内存(只有一个abc)
    猜测
      

  20.   

    1 永远记得equals和==的区别
    2 String常量池依据jvm不同,可能会不同
    3 就你的问题而言,debug的expression,str从栈中获取,但是那个"Andy",却是一个eclipse生成的新的常量。所以false了
      

  21.   

    这不是能不能这样判断的问题,lz是想测试下两种的区别,经我测试两者都为true,本机环境jdk1.6
      

  22.   

    对于"Andy"这样的字符串常量,在jvm空间中只开辟一片内存
    下面这个例子更好解释这个现象
    String str = "andy";
    String s = "andy";
    System.out.println(str==s);
    结果为true
    至于为什么会在debug中出现楼主的情况,6楼的解释甚好~~
      

  23.   

    程序员不能依赖于特定编译器的优化。
    OVER
      

  24.   

    你好,要判定字符串是否相等不能使用逻辑符号
    应该使用equals方法
    只有这样,Java虚拟机才能正常运行
      

  25.   

    正确的做法应该是 if(str1.equals(str2))
      

  26.   

    首先你这种string直接等于的写法jvm会在String的缓存池中指向同一个对象,这就是为什么你run的时候 == 为true。 但是DEBUG模式下你应该是watch那个运算式的吧,这时候ide就不像jvm那样会指向同一个缓存池中的对象所以变成了false。应该是这样吧,错了欢迎拍砖。