字符串比较,是我错了还是eclipse错了

-迷糊- 2011-10-19 02:36:54
	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错了?
...全文
1265 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2011-10-27
  • 打赏
  • 举报
回复
程序员不能依赖于特定编译器的优化。


OVER
Inhibitory 2011-10-27
  • 打赏
  • 举报
回复
是你错了,对Java的理解有误
kanme818 2011-10-27
  • 打赏
  • 举报
回复
首先你这种string直接等于的写法jvm会在String的缓存池中指向同一个对象,这就是为什么你run的时候 == 为true。 但是DEBUG模式下你应该是watch那个运算式的吧,这时候ide就不像jvm那样会指向同一个缓存池中的对象所以变成了false。应该是这样吧,错了欢迎拍砖。
diandimei 2011-10-27
  • 打赏
  • 举报
回复
正确的做法应该是 if(str1.equals(str2))
diandimei 2011-10-27
  • 打赏
  • 举报
回复
你好,要判定字符串是否相等不能使用逻辑符号
应该使用equals方法
只有这样,Java虚拟机才能正常运行
chuyun923 2011-10-26
  • 打赏
  • 举报
回复
对于"Andy"这样的字符串常量,在jvm空间中只开辟一片内存
下面这个例子更好解释这个现象
String str = "andy";
String s = "andy";
System.out.println(str==s);
结果为true
至于为什么会在debug中出现楼主的情况,6楼的解释甚好~~
梦如风 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 muyipan 的回复:]
str1 == "Andy" 这样判断是不对的。字符串不能直接==的
if(str1.equals("Andy")){

}
[/Quote]
这不是能不能这样判断的问题,lz是想测试下两种的区别,经我测试两者都为true,本机环境jdk1.6
sfeng1990 2011-10-26
  • 打赏
  • 举报
回复
两个都为true
Valefish 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 muyipan 的回复:]
str1 == "Andy" 这样判断是不对的。字符串不能直接==的
if(str1.equals("Andy")){

}
[/Quote]
+1
jdk1.5和1.6是不一样的
小绵羊 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 scrack 的回复:]

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

这个就是正解,那些什么字符串比较不能用==就不用说了,楼主题目意思都没看懂
zmkkobe 2011-10-20
  • 打赏
  • 举报
回复
我试了了第一个是false,第二十true的
shine333 2011-10-20
  • 打赏
  • 举报
回复
1 永远记得equals和==的区别
2 String常量池依据jvm不同,可能会不同
3 就你的问题而言,debug的expression,str从栈中获取,但是那个"Andy",却是一个eclipse生成的新的常量。所以false了
zhouguoq 2011-10-20
  • 打赏
  • 举报
回复
我觉得在debug模式下,每次用“abc”这个字符串都是要申请内存的(每次的abc都不同)
直接运行的话,编译器会对源码进行一定程度的优化,那么字符串"abc"可能就是使用的同一内存中的内容,而不是每次都要申请内存(只有一个abc)
。。。猜测。。。
-迷糊- 2011-10-20
  • 打赏
  • 举报
回复
其实这种问题挺无聊的,只要记住用equals就好了。
-迷糊- 2011-10-20
  • 打赏
  • 举报
回复
类似11,22楼这样的想法大家就不要回了,没有明白我说的意思哈。

我觉得6楼和9楼已经解释的比较明白了。大家看一下吧。
daishunchaoaiqiu 2011-10-20
  • 打赏
  • 举报
回复
charlie_jiao 2011-10-19
  • 打赏
  • 举报
回复
一般都用equals吧...
flowerjack 2011-10-19
  • 打赏
  • 举报
回复
没记错的话:
因为String是引用型,所以它的变量存的是一个地址,你那样比的是两个引用的地址。
但我之前也像你那样写,编译通过了,结果也是正确的,所以搞不懂了
flowerjack 2011-10-19
  • 打赏
  • 举报
回复
用equals
小绵羊 2011-10-19
  • 打赏
  • 举报
回复
表达式中的那个abc不是代码中的那个abc
加载更多回复(26)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧