public class stringTest {
public static void main(String[] args) {
    String s1="a"+"b";
    String s2=new String(s1);
    if(s1==s2)
 标记:System.out.println("==  is succeeded");
 if (s1.equals(s2))
  System.out.println("equals() is succeeded");
}}
做了标记的语句不执行,请问这个是为什么?

解决方案 »

  1.   


    String s2=new String(s1); 
    ==比对引用
      

  2.   

    菜鸟试着回答一下,s2为新建的另一字符串,它并不恒等于(==)s1,而equals方法中,用于判定是否指向同一块存储区域,显然此题中s1和s2是指向相同的对象。
      

  3.   


    s1="ab",它是在编译期,在系统的字符串常量池里面新建了一个字符串常量"ab",并且将这个地址赋给s1
    s2=new String(s1),它是先查看字符串常量池中有无和"ab"一样的字符串常量(显然有的)。然后在运行期在堆上创建一个引用s2,所以s1和s2仅仅字面上一样。也就是说,s1.equals(s2)返回true,但是,他们地址,一个指向内存的字符串常量区(属于栈),一个指向堆内存某块,当然他们地址不可能相同了,而==是比较地址的,所以s1==s2 返回false
      

  4.   

    if(s1==s2) 
    标记:System.out.println("==  is succeeded"); 
    s1和s2在内存中的地址不同~你用==来比较~他们俩的内容虽然一样~不过因为内存地址不一样~所以被认为不是一个内容~
    标记的也就不会执行了~
    而用equals()是比较里面的内容~跟==比较的不一样~ 所以会执行~
      

  5.   

    你回答的不对,红色部分错了娥。equals方法是比较字面上的内容,(literal content)-PS(原谅我,没读过中文教材。)^_^   而==才是比较是否指向同一块存储区域。
      

  6.   

     (原创)深入研究java对String字符串对象的创建以及管理 [推荐] 
    这个贴里讲的很清楚了!!!~~~~~~~~
      

  7.   

    ==比较对象地址,equals方法则变化多点
      

  8.   

    这个简单的讲法就是
    同一个对象可以有不同的名称
    就像一个人一样 一个人可以叫张三 ,他还可以叫 小四
    就看名字不看具体对某个人的话
    能知道张三 和小四 是一个人吗
    而 equals() 的话是调用 hashcode() 方法看他们是否指向同一个对象
    如果是的话就是一个人
    不是就不是一个人了。
      

  9.   

    equals()方法怎么会调用hashCode()呢(除非你自己显示这么做),别误导哦,呵呵
      

  10.   

    我也做标记了,怎么没显示错误呢?只给个警告public class Test { 

    public static void main(String args[]) { String s1="a"+"b"; 
        String s2=new String(s1); 
        if(s1==s2)
        back:System.out.println("==  is succeeded"); 
        if (s1.equals(s2)) 
           System.out.println("equals() is succeeded"); 
        }
    }
      

  11.   

    不好意思看错了,实在不好意思。
    简单的说吧,你可以先这么记
      == 比2个String是否是同一个对象,如果是返回true,否则返回false
    .equals()  比的是2个String的内容
      

  12.   

    如果用str1==str2判断两个字符串内容是否相等时,实际上比较的是它们在内存中的地址是否相同,其得到的值是逻辑值,与我们所希望的比较字符串的内容得到的值是不相同的。
      

  13.   

    同意2楼,String虽然是引用类型,但new之后会在内存中为s2创建新的地址,而不是对s1地址的引用。
      

  14.   

    ==和!=比较的是对象的引用,一般用于基本类型,而基类Object的equals()方法也是比较对象的引用,只不过String类覆写了基类的equals()方法,使它的行为变为比较String的内容(可以自己编写一个类,然后用equals()方法验证这句话),equals()方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
      

  15.   


    正解!
    字符串 有个自动扣留功能,即如果几个字符串一样,那么不会从新开心的空间,而是将几个引用同时指向该字符串对象,但是使用new操作符产生的字符串对象不行,因为new产生的对象存储在堆里面;
    所以==是不能成立的,所以不执行,使用equals可以执行!
      

  16.   

    String的==号比较的是对象的引用,而equals比较的是对象的内容,
    String s2=new String(s1); 这里s1和s2的内容虽然是一样的,但仅仅是内容一样,他们的引用是不一样的,