本帖最后由 fujing0103 于 2010-11-28 19:54:35 编辑

解决方案 »

  1.   

     原因是   ==        默认的是比较两个对象的引用
     其实equals()   默认的也是比较两个对象的引用,但是String重载了这个方法,让他比较内容了
      

  2.   

    自己的理解,错了的话别误解你:
    结果是:equals
    ==默认比较的是hash码,相当于C语言里面的地址
    而equals比较的是对象里面的具体内容。equals可以自己重写比较规则
      

  3.   

    equals就一个判断两个对象是否“相等”的方法 ,具体如何判断算是“相等“,可以由你自己写的来决定
    String类重写过了equals方法,只要2个字符串内容是相同的就算相等
    所以就返回true
      

  4.   

    java对字符串的处理比较特殊,会开辟一个字符串池,你每声明一个字符串(不用 new String()),他就会去搜索这个池看看是否已经存在,如果用new String()他会另辟内存,就是说
    String a=”How are you”;
    String b=new String(a);
    b的内容跟a一样,但是地址不同,
    如果是:
    String a=”How are you”;
    String b=”How are you”;
    那么b仅仅是a的别名,它们两个的引用空间的地址是一样的
      

  5.   

    public class MyClass
    {
    public static void main(String args[])
      {
    String a="How are you";
    String b=new String(a);
    if(a==b) System.out.println("==");
    if(a.equals(b)) System.out.println("equals");
      }
    }String a="How are you";在字符串池生成了一个对象,值是"How are you",a是它的引用。
    String b=new String(a);在堆里创建了一个对象,值是"How are you",b 是它的引用。
    ==比较的是地址,两个引用指向的地址很显然不同,一个在字符串池,一个在堆。
    equals比较的是值,值相同。如果改成
    String a="How are you";
    String b="How are you";(这里会先搜索字符串池,发现有相同的字符串存在,不创建新的对象)
    则两个引用指向相同的对象。此时会打印出 “==” 和“eauals".
      

  6.   

    建议楼主去看看Object和String这两个类的equals()方法,就知道了
      

  7.   

    equals() 是一个方法,是可以重写的,要怎么样比没人知,如果没有重写过的话,equals()比较的是对象的hashcode().
      

  8.   

    LZ 弄明白了 可以在试试这题!
                String a="1";
       String b="1";
               String c=new String("2");
               String d=new String("2");
       
    System.out.println(a==b);
    System.out.println(c==d);
    System.out.println(c.equals(d));
      

  9.   

    java中equals方法和“==”的区别equals 方法是 java.lang.Object 类的方法。
    (1) 如果是基本类型比较,那么只能用==来比较,不能用equals比如:
    public class TestEquals {
    public static void main(String[] args) 
    {
    int a = 3;
    int b = 4;
    int c = 3;
    System.out.println(a == b);//结果是false
    System.out.println(a == c);//结果是true
    System.out.println(a.equals(c));//错误,编译不能通过,equals方法
    //不能运用与基本类型的比较
    }
    }(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
    public class TestEquals {
    public static void main(String[] args) 
    { Integer n1 = new Integer(30);
    Integer n2 = new Integer(30);
    Integer n3 = new Integer(31);
    System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
    System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
    System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
    System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
    }
    }
    这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。(3) 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。
    (a)首先,介绍String的用法,请看下面的实例:
    public class TestEquals {
    public static void main(String[] args) {
    String s1 = "123";
    String s2 = "123";
    String s3 = "abc";
    String s4 = new String("123");
    String s5 = new String("123");
    String s6 = new String("abc");System.out.println(s1 == s2);//(1)true
    System.out.println(s1.equals(s2));//(2)true
    System.out.println(s1 == s3);//(3)flase
    System.out.println(s1.equals(s3));//(4)flaseSystem.out.println(s4 == s5);//(5)flase
    System.out.println(s4.equals(s5));//(6)true
    System.out.println(s4 == s6);//(7)flase
    System.out.println(s4.equals(s6));//(8)flaseSystem.out.println(s1 == s4);//(9)false
    System.out.println(s1.equals(s4));//(10)true
    }
    }
      

  10.   

    明显equals,"==" 是比较地址,A,B不等,EQUALS比较内容相等!
      

  11.   

    “==”是地址比较,“equals”是值比较
      

  12.   

    equals也不能说是值比较  要看这个方法被重写成什么样了就比较什么 equals是object类的一个方法   所有的子类都应该重写这个方法  String类重写这个方法的时候定义了比较值当然了其他的类重写的时候你比较什么就比较什么
      

  13.   

    “==”比较的是两个对象的地址是否相等,具体的来讲就是比较地址的值,而“equals”比较的是两字符串的内容;关键还是会花堆栈内存划分图!!!!!!!!
      

  14.   

    你的代码应当输出equals。下面的代码供你作对比:public class test{
      public static void main(String args[]){
        String a="How are you";
        String c="How are you";
        String b=new String(a);
        if(a==b) System.out.println("==ab");
        if(a==c) System.out.println("==ac");
        if(a.equals(b)) System.out.println("equals:ab");
        if(a.equals(c)) System.out.println("equals:ac");
        }
    }
    先自己想想结果是什么。结果应该是
    ==ac
    equals:ab
    equals:ac
    想明白为什么了吗?a和c在写程序的时候就都已经是写成了"How are you";
    虽然a和c变量名不同,但是他们指向相同的地址(这是因为,系统看到他们的内容是一样的,就把这个字符串存在同一个内存空间,只存储一次,之后吧这个空间的地址给变量名),也就是String变量所直接存储的东西,==运算符比较的就是这个直接的东西,所以a和c用==比较的结果是true;
    而需要注意的是,b=new String(a);和上面的直接写出来的效果是不一样的,系统真的会分配另一块空间出来~~所以用==比较a和c就是false;
    而equals就不一样了,它比较的是字符串的内容。你可以想象equals是怎么做的,取出字符串中中下标相同的字符一个一个地比较。
    a和b比较好理解,是两块不同内存区域中的数据一一比较,而a和b的比较实际上是同一块内存区域里面的东子,自己equals自己,所以返回结果也是true。
      

  15.   

    equals
    ==是地址比较equals是值比较
      

  16.   

    LZ 不防去看一下 http://blog.sina.com.cn/s/blog_6a98783b0100nr5a.html 
    equals 和 '==' 的真正区别 
      

  17.   

    等号是地址比较,“equals”是值比较
      

  18.   

    String , Data , File和基本数据类型的包装类重写了equals()方法使得其比较的是内容,而其他的类都是比较地址。
      

  19.   

    ava对字符串的处理比较特殊,会开辟一个字符串池,你每声明一个字符串(不用 new String()),他就会去搜索这个池看看是否已经存在,如果用new String()他会另辟内存,就是说
    String a=”How are you”;
    String b=new String(a);
    b的内容跟a一样,但是地址不同,
    如果是:
    String a=”How are you”;
    String b=”How are you”;
    那么b仅仅是a的别名,它们两个的引用空间的地址是一样的
      

  20.   


    public class Test
    {
    public static void main(String args[])
    {
    String a = "how are you?";
    String b = "how are you?";
    //String b = new String(a);
    if(a == b) System.out.println("==");
    if(a.equals(b)) System.out.println("equals");
    }
    }
    这样的话既能输出==,又能输出equals.原因是使用“==”是比较两个String 的地址,在java里面,这样定义意为着他们的地址是相同的,然后他们的值也相同,所以两个都输出来了。
      

  21.   

    equals
    ==比较的是地址,而“equals”比较的是内容,在String这个类里面重写了equals这个类,(去看看API里面String和equals这两个类)所以可以得出squals这个结果,去熟悉一下内存的分配对LZ会有用的