String str1 = new String("aaa");和
String str1 = "aaa"有什么不一样吗?为什么我用String str1 = "aaa";
String str2 = "aaa";
System.out.println(str1 == str2);得到的结果是true;
而用
String str1 = new String("aaa");
String str2 = new String("aaa");
System.out.println(str1 == str2);得到的结果却是false?

解决方案 »

  1.   

    String str1 = new String("aaa");
    str1是引用句柄,他存放在“栈内存”中
    new String()是创建对象开辟的对象空间,他存放在“堆内存”中。String str1 = "aaa";
    String str2 = "aaa";
    上面这种方式str1 与str2 指向同一个对象"aaa"。String str1 = new String("aaa");
    String str2 = new String("aaa");
    这种方式str1 与str2 指向两个具有相同内容的不同对象。两种情况是完全不同的。
      

  2.   

    String str1 = "aaa";
    String str2 = "aaa";
    System.out.println(str1 == str2);得到的结果是true;
    而用
    String str1 = new String("aaa");
    String str2 = new String("aaa");
    System.out.println(str1 == str2);得到的结果却是false?
    前者是两个String的句柄指向同一个内存中的数据,也就是两个指针指向同一个heap
    而java的==判断的就是同一地址的内容而后者相当于在内存中开辟了两个块,用==就是false,因为两个String的地址完全不同equals()比较的仅仅是内容