【Java基础面试题】String s = new String("ABC");创建了几个对象

107 阅读2分钟

  看这个问题前,需要先复习下Java创建字符串对象在内存中的工作过程(Java1.8+版本);

字符串对象

  字符串本质是一个对象,对象中有一个不可变实例变量value,且它是一个char数组(可参考源码);
image.png String s = "abc";

当使用字面量创建字符串时,系统本质会自动创建String对象、同时创建一个字符数组对象,
并将字符串实例变量value指向字符数组对象;
大概在内存中位置显示如下:
image.png

字符串常量池

  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[ ]对象引用的是同一个;   image.png
    内存中大概图示如下: image.png
    所以可知结论:创建了两个字符串对象和一个char数组对象;
    一般面试时问的是字符串对象的个数,也应严谨的回答是两个字符串对象。