关于==与equals方法的区别的比较。为啥c==d?而a!=b?难道是因为我在声明的时候进行了初始化?c==d到底比较的是什么?
如果c==d,那么为什么i!=j============================================
a.equals(b)
c==d
c.equals(d)
i.equals(j)
a instanceof Object
c instanceof Object
a instanceof String
c instanceof String============================================
package com.test.model;public class TestEquals {
    


/**
 * @param args
 */


public static void main(String[] args) {

String a=new String("abc");
String b=new String("abc");
String c;
String d;
//  int c;
//  int d;
c="123";
d="123";
Integer i= new Integer(1);
Integer j= new Integer(1);
if (a==b){
 System.out.println("a==b");
};
if (a.equals(b)){
System.out.println("a.equals(b)");
}
if (c==d){
 System.out.println("c==d");
}
        ;
        if (c.equals(d)){
System.out.println("c.equals(d)");
}
// System.out.println(a);
// System.out.println(b);
if (i==j){
System.out.println("i==j");
};
if (i.equals(j)){
System.out.println("i.equals(j)");
}
if (a instanceof Object){
System.out.println("a instanceof Object");
}
if (c instanceof Object){
System.out.println("c instanceof Object");
}
if (a instanceof String){
System.out.println("a instanceof String");
}
if (c instanceof String){
System.out.println("c instanceof String");
}
}}

解决方案 »

  1.   

    这个问题,人们已经懒得讨论了
    请lz看看论坛中其他的帖子,有不少关于这方面的讨论。
    主要就是讨论==和equals的区别,以及boxing发面的问题
      

  2.   

    3.6.5 检测字符串是否相等
    可以使用equals方法检测两个字符串是否相等。
    如果字符串s与字符串t相等,则表达式s.equals(t)返回true;
    否则返回false。
    需要注意,s与t可以是字符串变量,也可以使字符串常量。
    一定不能使用==运算符检测两个字符串是否相等!
    这个运算符只能够确定两个字符串是否被放置在同一个位置。
    当然,如果字符串放在同一个位置,他们必然相等。
    但是,完全有可能将内容相同的两个字符串放在不同的位置上。
    如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。
    但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。
    因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!
    From《Java2核心技术第七版卷I,基础知识,Page49》
    关于字符串变量常量的多看看吧,
    论坛里面精华区有帖子 String类型的重点总结 收藏 
    说明:本文为自己耗力总结,转载请注明出处。
    作者:zangxt
      

  3.   

    我把程序改了一下。发现关键是是否对于字符串变量进行初始化。
    这是修改过的程序=========================================
    package com.test.model;public class TestEquals {
        

    public static void main(String[] args) {

    String a=new String("abc");
    String b=new String("abc");
    String c;
    String d; c="123";
    d="123"; if (a==b){
     System.out.println("a==b");
    };
    if (a.equals(b)){
    System.out.println("a.equals(b)");
    }
    if (c==d){
     System.out.println("c==d");
    }
            ;
            if (c.equals(d)){
    System.out.println("c.equals(d)");
    }
            c=new String("123");
            d=new String("123");
            
            if (c==d){
     System.out.println("c==d");
    }
           ;
           if (c.equals(d)){
    System.out.println("c.equals(d)");
    } }}
    ========================
    这是执行结果:
    a.equals(b)
    c==d
    c.equals(d)
    c.equals(d)
    可以看出来。对c,d变脸进行new初始化后。b==c就不成立了。
      

  4.   

    还是自问自答吧。
    String c="123";
    String d="123";
    会导致虚拟机的常量共享。所以c和d指向通过一个地址。c==d成立。
    String c=new String("123");
    String d=new String("123");
    c和d现在是两个分配在堆内存的变量,因此c==d不成立。虽然c和d指向的地址中保存的值相同。高手给个指导,点评一下我的看法。
      

  5.   

    new出来的东西内存地址不同,你判断他们两个相等==,肯定是false了,
    String c = new String("123");
    String d = new String("123");
    c == d ? false
    d = c;//d指向了c指向的内存地址
    c == d ? true
      

  6.   

    我认为
    当“==”左右为基本八个变量时,是比较他们相等不相等;
    当“==”左右为对象时候,看其是否是同一个对象,即是
    不是在同一个同存(和原始Object类中的equals()方法一样),
    但是很多类中都重写了equals()方法,要看其具体是什么作用才行。
    我感觉 的就是这样,不知道对你有没有帮助。加油,楼主。
      

  7.   


    帖子我看了。心情变得很坏。
    帖子里说话跟绕口令是的,并且堆、栈不分。
    并且我觉得那个帖子说明了在以下情况下为什么s1!=s2.
    String s1 = "Java"; 
    String s2 = new String("Java"); 
    但我要问的是为什么在下面的情况里s1=s2;
    String s1 = "Java"; 
    String s2 = "Java"; 
    是因为s1和s2都指向了栈中同一个地址,还是说s1==s2比较的是栈里的值?
      

  8.   

    兄弟,下面的s1和s2都是字符串常量啊,JVM的字符串常量是共享的, 所以s1和s2的指向的内存地址是同一个地址,所以s1 == s2 ? true
      

  9.   

    非基本类型的数据类型都是内存地址的比较吧,或者hashCode的比较
      

  10.   

    String s1 = "Java"; 
    用这种方式初始化,此时,虚拟机会将 把“Java”放进一个 stringPool 里面String s2 = "Java"; 
    再进行这个变量的初始化时,虚拟机会看那个StringPool里面是否有这个字符串,有的话,就把s2指向这个字符串。这样一来,s1 和 s2 指向的是同一个地址。而 == 比较的是对象的内存地址,所以,就相等了
      

  11.   

    这个很明确了。
    请问
    String c = "123";
    String d = "123";
    的情况下c==d相当与123==123还是c和d在栈内的地址进行比较?
      

  12.   

    一句话,==比较的是“变量”的内容,equals比较啥要去看方法的实现。