class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
结果为:false
class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
结果为:true
class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a.equals(b));
}
}
结果为:true

解决方案 »

  1.   

    因为你用的是字符对象相比较,相当于比较的是a与b的内存地址是否相同,因为是两个内存单元,所以结果是false
    字符型对象比较是否相同,应该用equals
    明白没?
      

  2.   

    http://topic.csdn.net/u/20090519/18/7b8cf7ef-bc06-4d26-8a2c-692eb0562231.html
      

  3.   

    第二个打错了,应该是
    class Test{ 
    public static void main(String[] args){ 
    String a="taoyu"; 
    String b="taoyu"; 
    System.out.println(a==b); 


    第三个没问题,第一个和第二个为什么会有差别啊
      

  4.   

    建议去看一个张龙老师的java笔试面试深度剖析视频
      

  5.   

    class Test{ 
    public static void main(String[] args){ 
    String a=new String("taoyu"); 
    String b=new String("taoyu"); 
    System.out.println(a==b); 
    }

    class Test{ 
    public static void main(String[] args){ 
    String a="taoyu"; 
    String b="taoyu"; 
    System.out.println(a==b); 

    } 第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同。而第二个,两个对象都没有用new关键字,这时,涉及到了java的字符串池技术,在直接用s = "xxx"的形式时,会把=号后面的字符串放入字符串池,而且相同的字符串只放一次,所以a和b的地址是一样的,因为在字符串池里面。
      

  6.   

    ==比较的是对象的地址(如果是对象的话)。String是个特例,new的时候会重新分配内存。不new的时候用的还是原来的。
      

  7.   

    6楼正解,看到你的标题我就大概猜到你想问什么了,==比较的是内存地址,equal才是正真比较的数据。new表示在内存中创建一个区域,第二个那种情况就涉及到字符串池技术了。
      

  8.   

    这问题问了很多次了..
    用equals!!!!
      

  9.   

    第一个第二个的区别就是第一个实际上用new创建了两个String对象然后第二个中的两个是同一个String对象
      

  10.   

    ==比较内存地址
    equals比较内容
      

  11.   

    ==比较对象的引用
    equals比较对象的内容。
      

  12.   

    一般来说 java虚拟机在运行时 会有一些对象池,其中String类的对象就是池的一种,如果你有相同*内容*的String的话他回从池中取,所以地址是一样的,楼上的说过用equals是比内容的 如果你非要用等好 就重载他就可以了
      

  13.   

     这个问题很普遍
      
      要判断字符串是否相等应该用equals()
      "==" 判断引用地址是否相等
      

  14.   

    “==”地址的比较,equals内容的比较
    如果String a ="abc" String b="abc" (a==b)内存中的A已经有了ABC所以B只要指向A的地址就可以了,所以是true
    其实String 是一个引用变量,当用new产生一个新的对象时,就重新开辟了一个空间,所以(a==b)是false
      

  15.   

    很明显啊,这个你不是new出来的,所以他的地址是一样的都是对栈里面的同一个的taoyu的引用(内存地址当然一样),当你new的时候,他的栈里面存储字符串的地址就不一样了!!!
    也就是说,“==”比较的是引用对象的存储的首地址,而equals比较的是对象的内容!!!很容易理解啊~~~~
      

  16.   

    有意义吗,下一两个develop kits就把这问题解决了.就研究这个,始终就是做程序.做一辈子还不够,再做一辈子.
      

  17.   

    分清楚 基本类型和引用类型,以及equals和“==”的区别
      

  18.   

    http://topic.csdn.net/u/20090407/14/fa97148f-5d99-4d68-a2fb-ee3cdd5c4ba5.html?seed=1920410074
    你去看看这个帖子,里面有我的回答,应该很详细了
      

  19.   

    new操作是在堆内存中申请一块新内存,无论字符串的内存是否相等,它们的地址都不相同,所以为false
    String a="taoyu"; 
    String b="taoyu"; 
    “taoyu”在堆内存中只有一份,a,b都是对它的引用。地址相同,所以结果为true
    另,注意:==比较的是地址,equals比较是内容。
      

  20.   

    好些人认为equals比较的是内容,==比较的是“地址”,其实这是一个很大的误解。如果你不重写equals,你会发现,它也是在比较“地址”,它的效果和==是一样的。不信,请运行以下程序:public class Test{
        private int a=1;
        public static void main(String[] args){
              Test a1=new Test();
              Test a2=new Test();
              Test a3=a1;          System.out.println("a1==a2的结果:"+a1==a2);//false
              System.out.println("a1.equals(a2)的结果:"+a1.equals(a2));//也是false
              System.out.println("a1==a3的结果:"+a1==a3);//true
              System.out.println("a1.equals(a3)的结果:"+a1.equals(a3));//也是true
        }
    }我想说的是:如果你不重写equals方法,告诉equals方法如何比较内容(String类就是这样做的),那么equals方法和==的效果是一样的(其实==就是调用的Object的equals方法完成比较的,相关内容参见《thinking in java》)。
      

  21.   

    池里面的东东是可以重复使用的
    堆中的则只有NEW你没有new那是放在池中
    NEW了是放在堆中
      

  22.   

    原来你写错了,吓死我了,我以为JVM有问题呢..已经有人回答你了
      

  23.   

    6楼的答案很好了..   equals()比内容, "=="比地址.
    String a="abc";String b="abc";和
    String a=new String("abc");String b=new String("abc");是有区别的..前者执行的时候会在常量池里面创建"abc", 后面如果非new的形式定义字符串的话, 那么会直接在常量池里面去找,如果有就直接指向那个字符串,如果没有会在常量池里面新建.   new就不一样了,每new一次,会为它分配自己的内从空间.所以地址是不一样的
      

  24.   

    兄弟,你的理解有误
    System.out.println(a1);你可以试一下,看a1是什么?它其实就是一个地址,是通过继承Object类的toString()方法得到的字符串值。所以==比较的是地址。而通过equals我们比较的是同一个对象的属性值
      

  25.   

    初学者 String还是比较复杂的
      

  26.   

    A a=new A()
    a这个引用值是放在栈中的,而new A()则是放在堆中的。
    “==”只能比较栈中值的大小,equals可以比较堆中的值
      

  27.   

    用 ==  是比较的内存的地址  所以永远不可能是“true”  所以前两个不是很理解
    equle  比较的是内容  所以是true
      

  28.   

    equals比较对象的内容
    "=="比较的事地址"=="时出现 true 
    那因为你之前NEW过 系统发现一样就直接赋到上次NEW的那个地址了 貌似是这样
      

  29.   

    ==是比较的 两个字符串的 地址是否相等 而函数 equals是比较内容的
      

  30.   

    在String中重写了equals()方法
    Object 中equals()和==是一样的
    但是String中就是比较 a b的内存地址是否相同了
    当然是false了
    o(╯□╰)o
      

  31.   


        Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池中的一个对象。使用new操作创建的字符串对象不指向字符串池中的对象。(但是可以使用intern()方法使其指向字符串池中的对象。)
        “字符串池”,是Java为了提高内存利用率而采用的措施:当遇到String a = "taoyu"; 这样的语句时,Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"taoyo"对象,然后变量 a 指向这个地址;然后遇到语句String b = "taoyu",这时字符串池中已经有 "taoyu"了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。
        而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同。
      

  32.   

    要明白 == 和 EQUAL()比较的是不同的。另外 基本数据类型与引用数据类型的比较时也是不一样的都是基础的东西。
      

  33.   

     天呀,你这个还不知道:
     String a = new String("taoyu"); 与 String a = "taoyu" 产生的对象不一样的,
     使用new 关键字是新的对象,而直接赋值的那个Java为了省内存,在String池里装它对象,再次使用赋值时,两个String都是同一个对象,而new却都不是同一个对象,"=="是内存地址的对比,eques是值的对比.
    关键的东西是: Java有个String池.
      

  34.   

    涉及的知识点
    1 string池
    2 == 内存地址比较
    3 equals 值比较
      

  35.   

    第一个是比较内存地址,第二个应该也是FALSE才对吧,第三个是比较字符串的内容,你可以在网上搜索java string 详解,你会找到答案的
      

  36.   

    java中 ==和equals()是不一样的
    通常==用于数字类型的比较如int...
    而equals()主要用于字符类型的比较如string...
      

  37.   

    String类中,==比较内存地址,equals比较字符串内容,然而其他的类就不同了,Object 中equals()和==是一样的 ,
    String类的equals方法被重写了
      

  38.   

    第二个你写错了吧,和第一个一样
    java对String对象是有优化的,字符串常量编译的时候就已经分配好了,其实你弄明白这个问题简单,但是呢
    如果想进一步了解更多的jvm知识建议看看《深入Java虚拟机》
      

  39.   

    第一个是 内存地址的 比较,JAVA里不可以重载操作符,所以这样是false第二个是用equals来比较对象里的内容,所以是true
      

  40.   

    因为你用的是字符对象相比较,相当于比较的是a与b的内存地址是否相同,因为是两个内存单元,所以结果是false 
    字符型对象比较是否相同,应该用equals a.equals(b);
      

  41.   

    ==用于比较两个对象是否相同,相当于比较内存地址值,equals用于比较两个值是否相同至于第二个,他们都是指向“taoyu”这个对象的引用,
    所以为TRUE
      

  42.   

    原来Java里面还是隐藏着指针的概念的
      

  43.   

    这个问题有这么经典啊,我初到csdn就在回答这个问题,现在...
      

  44.   

    你可以和简单数据类型及他们的包装类同比较
    如:int a = 1;
        int b = 1;
        a == b     trueInteger a = new Integer(1);
    Integer b = new Integer(1);
    a == b          false
      

  45.   

         学习一下堆栈吧,值类型 & 引用类型