- 首先指明 java 虚拟机中存在一个叫 字符串常量池 的东西, 这个常量池的数据结构是一张表,里边的每个 String 对象都会有个引用,所以常量池中的String 对象是不会被回收的。
- java 中 "xxx" 都是字符串对象, 没有字面量这种东西的,每次要用到 "xxx" 的时候,都会去字符串常量池里边看有没有 value 数组是 {'x', 'x', 'x'} 的字符串对象,没有就创建一个, 有就拿到这个对象的引用。
- 再看String 类的有中参数为 String 的构造器
public String(String original){ this.value = origin.value; this.hash = origin.hash; }
也就是传进来的String 对象的 value 数组和hash 进行拷贝,然后把这个复制得到的 新String 对象放在了堆 中。
-
所以, String a = "a" 会先去看常量池中有没有存在 value为 "a" 的这个对象,没有就创建,有就获得引用给a,所以就会创建0或者 1个对象。 String a = new String("a"); 会先创建一个String 对象, 然后再看常量池中有没有存在有没有存在 value为 "a" 的这个对象,没有就创建,有就获得引用给original ,总共会创建 1 或者 2 两个String 对象。
9_1 String a = "a" 和 String a = new String("a");
最新推荐文章于 2023-06-04 15:57:23 发布