核心内容摘要
亚洲铯精品久久:跨越时空的深蓝诱惑,探索稀有金属的极致魅力
本文博主介绍一道经典的Java面试题需要分两种情况讨论关键点在于字符串常量池和运行时堆的区别。
Java中String strnew String(abc);创建了几个对象情况一当常量池中不存在abc字符串对象时会创建 2 个对象第一个对象在字符串常量池中类加载时abc这个字面量会被放入方法区的字符串常量池JDK 7 后常量池移到了堆中。
第二个对象在堆内存中new String(abc)会在堆内存中创建一个新的String对象它的内容指向常量池中的abc。
所以总共创建了1个常量池对象 1个堆对象 2个对象。
情况二当常量池中已经存在abc字符串对象时会创建 1 个对象第0个对象已在常量池中之前已经通过其他方式例如之前的代码执行过abc字面量或intern()方法将abc放入了常量池所以此时不会再创建常量池对象。
第一个对象在堆内存中new String(abc)仍然会在堆中创建一个新的String对象。
所以总共创建了0个常量池对象 1个堆对象 1个对象。
代码示例说明// 假设程序刚开始运行常量池是空的Strings1abc;// 第一次出现abc常量池创建1个对象堆中不创建Strings2newString(abc);// 常量池已存在abc不再创建堆中创建1个新对象第一行创建1个对象常量池。
第二行创建1个对象堆。
两行总共创建2个对象1个常量池 1个堆。
核心
总结String str new String(abc);中的abc字面量本身会触发常量池对象的创建如果尚未存在。
new关键字总是会在堆中创建一个新的String对象。
所以可能的创建对象数是1个或2个取决于常量池的初始状态。
这也是为什么推荐使用String s abc;而不是new String(abc)避免不必要的堆对象创建。
最终答案面试标准回答如果字符串常量池中之前没有abc则会创建2个对象1个在常量池1个在堆。
如果常量池中已有abc则只会创建1个对象堆中的新对象。