在Java中用java.lang.String来表示字符串
字符串底层使用字符数组来储存字符串的每一个字符 但是从Java9开始 就改成使用byte[]去储存字符串中的字符内容
所有字符串字面量都是字符串实例
字符串对象一旦创建成功以后 他的内容是不可以被修改的
在Java中 有一个字符串常量池(SCP 即String Constant Pool)
从Java7开始他属于堆空间的一部分(以前属于方法区的一部分)
当遇到字符串字面量时 会去查看SCP
如果SCP中存在与字符串字面量内容一样的对象A的话 那么就会返回对象A
否则 就会创建一个字符串对象C 加入SCP 然后返回对象C
接下来主要给定一个实例 去分析底层的内存细节
public class Main {
public static void main(String[] args) {
String s1 = "mj";
String s2 = new String("mj");
String s3 = new String(s1);
String s4 = new String(s2);
char[] cs = {'m', 'j'};
String s5 = new String(cs);
String s6 = new String(s5);
}
}
我们可以通过断点调试功能来作证一下我们的想法的正确性
可以看到每一个在main方法中创建的局部变量的id都是不一样 这可以反映出每一个对象的内存都是不一样的(但让内存地址也有这样的作用 但不能说id和内存地址是等价的)
然后也可以看到前四个字符串对象中的字符数组对象是一致的 然后s5和s6的字符数组对象是一致的并且他们的字符数组是有别于cs的字符数组对象的