用==号就是不行,而我用EQUALS就可以,为什么?

xddy 2003-04-21 11:14:03
可是ADD WATCH(strCmd=="save") 明明是TRUE
String strCmd = REQ.getParameter("cmd");
String strCopyName = REQ.getParameter("text_copyName");
// if(strCmd.equals("save")){
if(strCmd=="save"){
saveCopy(strCopyName);

}else{
deleteCopy(strCopyName);

}
却总是执行ELSE中的代码


...全文
44 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
井中老男孩 2003-04-22
  • 打赏
  • 举报
回复
我确信这是调试器的bug,建议你不要这样调试(直接ADD WATCH (a==b))而要c=(a==b)
ADD WATCH (c).

否则影响执行结果
井中老男孩 2003-04-22
  • 打赏
  • 举报
回复
我试过了,的确是这样,至于为什么会出现这种情况,我不同意 xmagicwu(死过方生)的说法,但我也不知为什么会这样。
我想这是调试器的bug
java_jin 2003-04-21
  • 打赏
  • 举报
回复
==是指向同一个对象才true;
equals是比较内容
比如
String a="hello";
String b=new String("hello");
String c=a;

if(a==c) 返回是true;
if(a==b)返回falsh;
if(a.equals(b)) 返回true;
xddy 2003-04-21
  • 打赏
  • 举报
回复
可是ADD WATCH(strCmd=="save") 明明是TRUE。
dongdongshu 2003-04-21
  • 打赏
  • 举报
回复
strCmd是String类的一个对象,也就是说,你可以把它看作C语言的指针,指针和指针指向的内存地址的内容肯定没法相等。
浅显一点,对象就是电视机,而对象的句柄就是遥控器,句柄只是提供了让你方便操作对象的途径。
iStringTheory 2003-04-21
  • 打赏
  • 举报
回复
学习--
w_tao8029 2003-04-21
  • 打赏
  • 举报
回复
“==”比较的是内存地址
equlas 比较的是值
xddy 2003-04-21
  • 打赏
  • 举报
回复
jb中的data watches。
moumouren 2003-04-21
  • 打赏
  • 举报
回复
ADD WATCH(strCmd=="save") 是什么意思 ?
Lalphbet 2003-04-21
  • 打赏
  • 举报
回复
==比较的是references,而equals如果使用基本类型的Wrapped class对象来调用的话,是比较内容。
如果是自己创建的class的话,则效果跟==相同。。。
xddy 2003-04-21
  • 打赏
  • 举报
回复
可是ADD WATCH(strCmd=="save") 明明是TRUE
Philzzf 2003-04-21
  • 打赏
  • 举报
回复
因为这是基础
mydky 2003-04-21
  • 打赏
  • 举报
回复
==是指内存地址相同才可以的,但是EQUALS只要内容相同就可以了
bubblebird 2003-04-21
  • 打赏
  • 举报
回复
String类型是object,比较时要用equals,只有基本数据类型才用==
xddy 2003-04-21
  • 打赏
  • 举报
回复
to:死过方生
终于有人明白我说什么了
Mr月亮 2003-04-21
  • 打赏
  • 举报
回复
建议你分别用:
boolean b1 = (a == b);
boolean b2 = (a.equals(b));
然后用:
ADD WATCH (b1);
ADD WATCH (b2);
看看。
你出现的情况可能是由于ADD WATCH对监测值先产生副本再比较造成的(猜测而已),例如:
tmpa = a;
tmpb = b;
返回tmpa和tmpb得比较结果,这时候用wks(揭贴率100%)的贴解释就知道为什么ADD WATCH 的时候是true而if的时候是false了。
kknd97 2003-04-21
  • 打赏
  • 举报
回复
我来简单说明一下:
在java里面 == 如果用在主类型比较的时候是判断类型值是否相同,比如:
int a=1,int b=2;
if(a==b)
System.out.println("相等");
else
System.out.println("不等");
这时候判断的是变量的值。
java的主类型是如下几个:
short,int,long,float,double,char,byte,boolean
注意大小写。
但是java里面的String是一个类。
String t="测试",t1="测试1";
这时候t和t1分别是指向String类实例的句柄(其实就是一个整形的内存地址)。
如果还使用 == 来判断的话,java只判断t和t1的句柄值是否相等(由于是两个不同的类实例所以句柄值是不同的)。
所有,使用==来判断String是不对的,应当用equals方法。
祝你好运!
xddy 2003-04-21
  • 打赏
  • 举报
回复
谈了这么多,还是没有解决我的问题,也许是我问的不够清楚。我整理了一下我的问题
package untitled6;

public class Untitled1 {
public Untitled1() {

String a="hello";
String b=new String("hello");//加断点

if(a==b){System.out.print("a==b") ;}
if(a.equals(b)){System.out.print("a.equals(b)"); }

}
public static void main(String[] args) {

Untitled1 oU= new Untitled1();

}


}

答案无疑是a.equals(b)

可是在DEBUG时候你ADD WATCH(a==b)它会显示TRUE但不会执行System.out.print("a==b")
井中老男孩 2003-04-21
  • 打赏
  • 举报
回复
一般情况下,对于对象而言,==是比较地址,equals是比较内容
但在处理字符串方面有一点特殊
如果是显式建立的对象,则==是比较地址,equals是比较内容
比方
String a=new String("123");
String b=new String("123");
则a==b比较的就是地址
但是如果这样:
String a="123";
String b="123";
String c=a;
则a==b,b==c,这时比较的就是内容
另外
b="123";
a=b.UpperCase();
则a==b,这时比较的是地址,可以查看UpperCase函数的原代码,这种情况下返回b的指针,所以a==b
joy_wind 2003-04-21
  • 打赏
  • 举报
回复
又看了一下你的问题,发现你产生疑惑的不是我所说的问题。

ADD WATCH(strCmd=="save")返回false不奇怪,因为strCMD是一个对象,“save”是另一个对象,虽然它们包含相同的字符,但是它们不是同一个对象,所以不等。“==”号判断的是两个对象是否是同一个对象,equals方法判断的是逻辑意义上的相等,你可以重载它并以自己的相等标准来决定它返回的是真还是假,但是"=="不允许重载,它只强制判断两个对象变量是否指向了同一个对象。
加载更多回复(6)

62,616

社区成员

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

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