五、(面试题)String str = new String("xyz")
一共创建了几个对象?
String str = new String("xyz")
一共创建了几个对象?
答案是:一个或两个
分析:
- 首先,代码中 new 会在堆中创建一个 String 对象;
- 然后将
"xyz"
字面常量拿到字符串常量池中去获取它对应的 String 对象引用,如果拿不到,就会在堆内存中创建一个"xyz"
的 String 对象; - 并且把引用保存到字符串常量池里面;
- 后续如果再有字面量
"xyz"
的定义,只需要行常量池获取对应的引用就可以了,不需要再创建。
例如:
String s1 = new String("hello java"); // 创建了两个对象,一个是 hello java 字符串常量,一个是 new String 实例对象
String s2 = new String("hello java"); // 创建了一个对象,new String 实例对象
图解:
简单来说:
- 如果
xyz
这个字符串常量不存在,则创建两个对象,分别是xyz
这个字符串常量,以及new String
这个实例对象。 - 如果
xyz
这字符串常量存在,则只会创建一个new String
实例对象。
Java 为了避免产生大量的字符串对象,设计了一个字符串池(String Pool),通过初始化的方式创建的字符串存在于字符串池中,且字符串池中的字符串不会重复,以便可以被共享使用,提高存储效率。