看这个问题前,需要先复习下Java创建字符串对象在内存中的工作过程(Java1.8+版本);
字符串对象
字符串本质是一个对象,对象中有一个不可变实例变量value,且它是一个char数组(可参考源码);
String s = "abc";
当使用字面量创建字符串时,系统本质会自动创建String对象、同时创建一个字符数组对象,
并将字符串实例变量value指向字符数组对象;
大概在内存中位置显示如下:
字符串常量池
Java为提升系统性能,对于部分字符串对象是有复用操作的,
如果发现有相同字面量的字符串可直接复用不再创建新对象;
此时是有一套是否复用的规则的;
- 可复用情况
- 字面量直接赋值字符串 String s = "abc";
- 字符串常量 public static final String S = "adc";
- 字符串字面量直接拼接 String s = "ab"+"cd";
- 不可复用情况
- new方式创建字符串 String s = new String()
- 字符串变量拼接
String s = new String("ABC");
此时再看题中的语句;
-
"ABC"字面量先创建了一个String对象+char[ ]对象,同时将字符串对象引用存储在常量池中;
-
new String("ABC") 调用构造方法、且不会复用常量池中已有对象,
会再创建一个String对象,此时并没有再创建char[ ]对象,
因为根据传参调用的是如下String构造方法;
可以推出"ABC"字面量创建的对象的属性value又赋给了此时新建String对象的value,
所以char[ ]对象引用的是同一个;
内存中大概图示如下:
所以可知结论:创建了两个字符串对象和一个char数组对象;
一般面试时问的是字符串对象的个数,也应严谨的回答是两个字符串对象。