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);
}
}
运行结果为:
原因:==比较的是他们在堆内存中的地址,s和s1的地址不同,所以输出false。
第二个输出true,是因为String为共享模式的一种应用,String pool中内容相同则直接指向,不会重新开辟内存空间。