String s1=new String("a")
String s2=new String("a")这样是在栈中有两个引用s1和s2,它们的值不同,分别指向堆中的两个对象,对象的值都是a.
而String s1="a";
String s2="a";在栈中有几个引用呢?在堆里有几个对象呢?它们是怎么指向的啊?

解决方案 »

  1.   

    s1和s2他们指向的是同一个"a",所以==。如果
    String s1=new String("a")
    String s2=new String("a")
    就是s1!=s2,因为s1,s2的分配的内存地址不同了。
      

  2.   

    我今天看了JDK的帮助,它说String str = "abc";等价于char data[] {'a', 'b', 'c'};
    String str = new String(data);我又测试了下这个:
    class Test
    {
    public static void main(String[] args)
    {
    char data[] = {'a', 'b', 'c'};
          String s1 = new String(data);
          char data1[] = {'a', 'b', 'c'};
          String s2 = new String(data1);
             if(s1==s2)
             {
    System.out.println("==");
    }
    else
    {
    System.out.println("!=");
    }
    if(s1.equals(s2))
    {
    System.out.println("equals");
    }
    else
    {
    System.out.println("!equals");
    } }
    }为什么输出是!=和equals呢?
      

  3.   

    String s1="abc";
    String s2="abc";
    结果s1==s2?巧合?
      

  4.   

    以前只听说
    String s1="abc";
    String s2=s1;
    这种情况下s1==s2
    但是我试了几次都是==
      

  5.   

    使用new String()构造字符串,总会在内存中新辟空间存放内容
    所以地址是不一样的
    用==判断总是不同的
    equals判断内容相同所以能相同
      

  6.   

    用String s1="abc","abc"是一常量放在串池中
    当再声明一个String s2 = "abc"时s2指向的地址与s1指向的地址是一样的
    所以用s1==s2判断时,返回值为true ;
    用equals 就不用说了内容一样返回true ;
      

  7.   

    同意SADOCom() 
    JAVA是“懒”,看到已经存在“abc"这个字符串,就在String s2时直接拿来引用了。
      

  8.   

    == 判断地址 equals判断内容 明白否?
      

  9.   

    == 判断地址 equals判断内容=========================简明 易懂
      

  10.   

    用String s1="abc","abc"是一常量放在串池中
    当再声明一个String s2 = "abc"时s2指向的地址与s1指向的地址是一样的
    java不会再开辟空间给字符串abc的哦,所以字符串还是以前的字符串,所以String s1="abc",String s2="abc",就是s1指向了abc字符串,s2也指向了abc字符串,==用来比地址,对于同一个abc字符串,地址显然是一样滴嘛。