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错了?
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
然而他再计算某些表达式的时候 例如str1=="Andy" str1 他会去内存找到这个变量 而"Andy"像这种 他不会像编译器一样做优化处理 而是直接去内存里生成了。所以JVM的内存空间 跟IDE 的内存空间是两个概念
就是说debug查看的是IDE得出的表达式结果,可能也JVM的不一样;而运行是根据配置的JDK。是这个意思吧?
在我的机子上着2句都可以输出
就是说这2个都是true
Eclipse 会在内存里重新申请一个空间来做为常量的存贮
所以编辑的时候走的是TRUE 放在表达式监控的时候就成了FALSE
if(str1.equals("Andy")){}
System.identityHashCode("abc");监视一下这2个表达式就知道了
因为String是引用型,所以它的变量存的是一个地址,你那样比的是两个引用的地址。
但我之前也像你那样写,编译通过了,结果也是正确的,所以搞不懂了
直接运行的话,编译器会对源码进行一定程度的优化,那么字符串"abc"可能就是使用的同一内存中的内容,而不是每次都要申请内存(只有一个abc)
猜测
2 String常量池依据jvm不同,可能会不同
3 就你的问题而言,debug的expression,str从栈中获取,但是那个"Andy",却是一个eclipse生成的新的常量。所以false了
下面这个例子更好解释这个现象
String str = "andy";
String s = "andy";
System.out.println(str==s);
结果为true
至于为什么会在debug中出现楼主的情况,6楼的解释甚好~~
OVER
应该使用equals方法
只有这样,Java虚拟机才能正常运行