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