str,str1均是“ABC"的引用。
str==str1是判断这两个引用是否相同。(即他们指向的地址是否相同)
而str.equals(str1)则是判断他们指向的值是否相同。
故不论以那种方式初始化。str.equal(str1)总是true;

解决方案 »

  1.   

    用==比较的是地址,用.equals比较的是值。用new会预先分配地址空间,而赋值则不会
      

  2.   

    ==用来判断两个对象的指针是否相等,而。equals(Object )用来判断两对象的内容是否相等
    (即对象的类型、成员变量)
    String类维护这一个静态的字符串列表,所以:str。intern()==str1。intern();
      

  3.   

    刚看万think in java 
    说“==”是比较实例的reference ,这个中文意思我也不太懂,
    “.equal”是可以复写的类,缺省情况下也是比较reference
    new 是分配了内存空间,跟String的付值不一样String str = "ABC";
           str1 = "ABC";
    是比较他们的值吧?
    个人见解,不知错多少《------仁者见仁,智者见智-----〉
      

  4.   

    依我的个人意见:
    楼主说的那种情况,用String str="ABC";与String strl=new String("ABC");对str与strl来说反回的值均为引用,即字符串的地址,但是后者加了new关键字,表示新开辟内存空间,也就是第二个字符串与第一个不在同一地址范围内,用str==strl来比较时比较的为二者的引用,即地址,自然结果为false,而用str.equals(strl)比较的为二者之值,自然结果相同,反回值为true。此为小弟的个人意见,望高手指给以指证,小弟谢过!!!1
      

  5.   

    在JAVA语言中,String xx="abc" 也是一个对象,JAVA自动帮你分配内存,
    如果你再次 String xxx="abc",那么xx 和xxx指向同一个对象"abc",
    == 是判断 xx和xxx是否指向同一个内存
    .equals是判断 xx和xxx指向的两块内存中的内容是否一致gl
      

  6.   

    to MASTERPROSER(编程在西元前) 
    reference就是引用啦
    楼主的问题大家都回答了
      

  7.   

    如果要比较2个string,用equals()
    或者用==前加上intern()字符串回扣函数
      

  8.   

    new 会在你的内存中开辟新的空间,而=不会,会先在内存中找是否有“ABC”,如果有直接指向这个内存块,没有才开辟空间,所以你的问题很好理解了!
      

  9.   

    答案如下:
       方法1生成的对象在内存中有且只有一份,在用发放1生成同样的字符串,会把已有地址直接赋给变量使用。如 String str1="ABC"; String str2="ABC"; 相当于 str2=str1;
       方法2没调用一次,就会产生一个新的内存对象。也就是说和方法1使用了不同的内存。   .equals 缺省是以object reference 比较,但一般类的实现都是比较object reference 所对应内存中的值是否相等。
      

  10.   

    上面各位讲的都很有理,通俗一点来说,==比较的是两个对象是否相同,从上面来看显然是两个String对象,返回的只能是false。.equals比较的是String对象中字符串是否相同。可以改写方法实现特殊要求的比较。
      

  11.   

    java会在内存中创建一个String的池,用于放所有的String,但是创建相同内容的字符串,
    通常系统会检查池里面是否有相同的串,有就直接使用已有的串,不再新建。
    但是用new的话,就永远都新建一个串。String s1 = "ABC";    //创建一个ABC
    String s2 = "ABC";    //共用s1的ABC
    String s3 = new String("ABC");  //再创建一个ABC
    上面语句在池里面建立两个ABC,s1和s2指向同一个ABC,s3指向另外一个。==是判断引用是否相同,equals是判断对象的内容是否相同。接上面
    s1 == s2;  // 注意这里为true;
    s1 == s3;  // false;
    s1.equals(s2);  //true;
    s1.equals(s3);  //true
      

  12.   

    用String str1="ABC";声明的时候,会先检查内存区是否已有"ABC"这个常量是否存在
    而用new 时则直接创建一个新的String
      

  13.   

    还有
    String s1 = "ABC";  //新创建一个ABC
    String s2 = "ABC";  //指向s1
    String s3 = new String("ABC");  //新建立一个ABC
    String s4 = "abc";  //新建一个abc
      

  14.   

    谢谢各位的解答,我已经理解这个问题的原因了:关键在于申明String的变量时,Java会先找一下是否已经有这个值,如果有不分配新的空间.