String是引用类型,String类中的内容一旦声明则不可改变,它是Java中共享模式一种应用。

String有两种赋值方式:

1 直接赋值    String str=abc;   句柄指向新开辟的内存空间

2 new开辟空间    String str=new String(”abc”);

abc”是匿名对象,那么在堆内存中就会有块空间是“abc”,紧接着new String("abc") 使用new在堆内存中又开辟了一个空间“abc,最后String str1 = new String("abc") ;代码将最后生成的“abc”内存地址指向str1,最早的一个“abc”就没使用上,如图所示:

 

来看下面代码:

public class Demo {

 

   

    public static void main(String[] args) {

       String s=new String("abc");

       String s1="abc";

       String s2="abc";

       System.out.println(s==s1);

       System.out.println(s1==s2);

      

    }

 

}

运行结果为:

 

原因:==比较的是他们在堆内存中的地址,ss1的地址不同,所以输出false

    第二个输出true,是因为String为共享模式的一种应用,String pool中内容相同则直接指向,不会重新开辟内存空间。