String a="abc";
String b="abc"; 
System.out.println(a==b);
系统会输出什么,说明理由

解决方案 »

  1.   

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址
    一般重写了equals()方法就表示比较它们“实际意义上相等”,比较的是内容,而不是引用地址
    String 重写了equals 方法
      

  2.   

    输出true原因:在内存堆中还有个东西就“串池”,当你以赋值的形式,即String a = "abc";给a赋值,系统会先在“串池”里找有没有,没有就创建,如果有,就直接给赋值了。在这里例子中String a = "abc",之前“串池”中没有,于是系统创建了一个,String b = "abc"到“串池”中寻找的时候,有了,于是直接赋与内存地址,因此输出为true。
    直接new出来的字符串不在“串池”中,因此每次new的是不“==”的。
      

  3.   

    String 重写了equals 方法
      

  4.   

    对直接赋值和new是不一样的~~比如
    String a = new String("abc");
    String b = new String("abc");
    System.out.println(a==b);结果为false
    记住==永远是比较的地址,至于楼主的情况为什么是true,原因是地址一样,原因如2楼所说;
    大多数情况下(就是没重写equals的情况)==与equals是等价的,让你看看所有类的父类Object中equals方法:public boolean equals(Object anObject) { 
    if (this == anObject) { 
    return true; 

    如果重写了equals方法,比如String类中的equals方法
    public boolean equals(Object anObject) { 
    if (this == anObject) { 
    return true; 

    if (anObject instanceof String) { 
    String anotherString = (String)anObject; 
    int n = count; 
    if (n == anotherString.count) { 
    char v1[] = value; 
    char v2[] = anotherString.value; 
    int i = offset; 
    int j = anotherString.offset; 
    while (n-- != 0) { 
    if (v1[i++] != v2[j++]) 
    return false; 

    return true; 


    return false; 
    } 这样其实在地址不相等的情况下会继续比较值,如果值相等,返回true
    ==返回的结果和重不重写equals没关系,重写equals只会对Object.equals(Object)的结果造成影响,所以楼主的结果为true就是因为他们的地址相等,跟重写equals没关系
      

  5.   

    会输出true.你equals比较的是两者的内容,==是比较两者是否为同一对象,相信你也是这么理解的。这个题的关键在于String类的机制,Java中有个字符串池,每个字符串都在池中有一份,以后再用到哪个的话,就直接到池中找,如果找到的话就直接拿来用,否则再new出一个新的。本例中,a和b实际上指向同一字符串,所以用==比较结果是true,当然用equals比较结果也是true.
      

  6.   

    4楼的是不是Java的源代码拷贝出来的??建议楼主去看看源代码就能更明白一些了
      

  7.   

    :"=="和equals方法究竟有什么区别? ==操作符专门用来比较变量的值是否相等。比较好理解的一点是: 
    int a=10; 
    int b=10; 
    则a==b将是true。 
    但不好理解的地方是: 
    String a=new String("foo"); 
    String b=new String("foo"); 
    则a==b将返回false。 根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。 
    对象内容的比较,正是equals方法做的事。 看一下Object对象的equals方法是如何实现的: 
    boolean equals(Object o){ return this==o; } 
    Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。 看一下一个极端的类: 
    Class Monster{ 
    private String content; 
    ... 
    boolean equals(Object another){ return true;} } 
    我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。 所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。 
    将这篇文章推荐给你
    http://topic.csdn.net/u/20080720/16/5e1e2b39-44c2-48ef-872a-5b00bd8a9826.html
      

  8.   

    ==是比较两者在内存中的地址.equals是比较两者的内容.当然地址一样,内容一定一样
      

  9.   

    会输出false
    equals是调用对象的equals方法进行比较,通过重写equals方法,
    程序员可以自定义比较逻辑。
    ==是分别调用两个对象的hashCode函数,将函数执行的hash结果值进行比较,
    一般只有当两个变量指向同一个对象时它们的hashCode值才会一致。
    在实际使用时,对于值类型的比较我们一般可采用==,而对于引用类型的比较
    一般采用equals。
      

  10.   

    String a1 = "abc";
    String b1="abc";
    String  a = new String("abc");
    String b = new String("abc");
    System.out.println(a.equals(b));
    System.out.println(a==b);
    System.out.println(a1.equals(b1));
    System.out.println(a1==b1);
    true
    false
    true
    true