String对象创建的两种方式
方式一:通过字符串常量的方式创建
//方式一:通过常量的方式创建string对象
//以下两行代码表示底层创建了3个字符串对象,都在字符串常量池当中。
String s1 = "abcdef";
String s2 = "abcdef" + "xy";
方式一 的内存图(截图于老杜JAVA),s1和s2的内存地址指向了字符串常量池中的字符串。因为s2是“abcdef”和“xy”的拼接,又因为“abcdef”,s1已经创建了,所以s2直接拿过来。这也就是为什么要把字符串存储在方法区的字符串常量池中的原因,第一次创建了,第二次使用时就不用创建了直接拿过来用。
方式二:通过new对象的方式创建
//通过new的方式创建String对象。
//分析:结合以上内容可以先分析s3的“xy”从哪来。
//提示:凡是“”括起来的都在字符串常量池中。
//注意:new对象的时候一定在堆内存中开辟空间。
String s3 = new String("xy");
方式二的内存图,s3在内存中存在的形式就是,栈中的s3的内存地址指向堆中的String对象,堆中的String对象中的内存地址又指向方法区中“xy”的内存地址。
如果堆里面new的是一个User对象,User对象里有一个String类型的name属性,则User的name里存储的并不是具体的字符串,而是存储的是字符串在字符串常量池中的内存地址。