String类型是object,比较时要用equals,只有基本数据类型才用==

解决方案 »

  1.   

    ==是指内存地址相同才可以的,但是EQUALS只要内容相同就可以了
      

  2.   

    可是ADD WATCH(strCmd=="save") 明明是TRUE
      

  3.   

    ==比较的是references,而equals如果使用基本类型的Wrapped class对象来调用的话,是比较内容。
    如果是自己创建的class的话,则效果跟==相同
      

  4.   

    ADD WATCH(strCmd=="save") 是什么意思 ?
      

  5.   

    “==”比较的是内存地址
    equlas 比较的是值
      

  6.   

    strCmd是String类的一个对象,也就是说,你可以把它看作C语言的指针,指针和指针指向的内存地址的内容肯定没法相等。
    浅显一点,对象就是电视机,而对象的句柄就是遥控器,句柄只是提供了让你方便操作对象的途径。
      

  7.   

    可是ADD WATCH(strCmd=="save") 明明是TRUE。
      

  8.   

    ==是指向同一个对象才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;
      

  9.   

    兄弟姐妹们,我很感谢你们的回答,但你们的回答都是一样的。
    无非实说其实strCmd=="save" 是false.因为 strCmd和"save" 的地址不是一个。
    我已经明白了。
    我要说的是我在JB中strCmd=="save" ADD WATCHES中它显示TRUE我想是不是JB把这个expression
    解释为strCmd.equals("save")或是其他东西。有知情者请谈谈
      

  10.   

    upstring 属于值对象,其equals方法按照这种语义进行了处理==是对象的比较,
      

  11.   

    to java_jin(小柱子) 
     你把这段代码放到调试状态,然后你add a==b 到WATCHES中看看结果好吗?
      

  12.   

    从==和equals的用法来说。如果==是true,那么equals一定是true的。有没有可能楼主你贴出的代码不详细,或者其他什么地方出了错?
      

  13.   

    这里有一个“字面值”(literal)的概念。为了节省空间,java对串字面值作了特殊处理,它在编译的时候把所有包含相同字符的串字面值作为同一个对象来处理。所以ADD WATCH(strCmd=="save")返回true是有道理的,因为它们是同一个对象!这意味着strCmd最开始的赋值肯定是来源于一个串字面值“save”!要用相同的串字面值创建不同的String对象,必须使用New操作符。
      

  14.   

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

  15.   

    一般情况下,对于对象而言,==是比较地址,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
      

  16.   

    谈了这么多,还是没有解决我的问题,也许是我问的不够清楚。我整理了一下我的问题
    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")
      

  17.   

    我来简单说明一下:
    在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方法。
    祝你好运!
      

  18.   

    建议你分别用:
    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了。
      

  19.   

    我试过了,的确是这样,至于为什么会出现这种情况,我不同意 xmagicwu(死过方生)的说法,但我也不知为什么会这样。
    我想这是调试器的bug
      

  20.   

    我确信这是调试器的bug,建议你不要这样调试(直接ADD WATCH (a==b))而要c=(a==b)
    ADD WATCH (c).否则影响执行结果