对于String的创建有两种方式,一是直接赋值,二是使用构造方法将其实例化
一、直接赋值
String str = "jim";
执行这段代码时,JVM会在常量池中开辟空间存放jim并让str指向该空间;
String str = "jim";
String str1 = "jim";
System.out.println(str == str1);
输出:true
说明二者指向同一处内存空间
执行第一行代码时,JVM会在常量池中开辟空间存放jim并让str指向该对象;
执行第二行代码时,JVM会首先检查常量池中是否已经存在一处内容为jim的空间。如果存在就让str1指向该空间,否则在常量池中开辟一个新的内存空间用于存放该字符串
二、构造方法将其实例化
String str2 = new String("abc");
String str3 = new String("abc");
System.out.println(str2 == str3);
输出:false
说明二者指向的不是同一处内存空间
执行前两行代码时,JVM会在堆中开辟两个不同的空间用于存放str2和str3。采用这种方式每定义一个String类型的变量,无论内容是否相同,都在栈中开辟空间储存首地址,在堆中储存数。
要输出通过这种方式赋值的字符串需要调用toString方法
System.out.println(str2.toString());
输出:abc
所以两种创建方式中第一种明显节省内存空间