三维压电陶瓷悬臂梁振动仿真与能量采集优化研究:基于COMSOL的稳态频域分析与结构参数扫描
2026/4/1 3:40:33
本文博主介绍一道经典的Java面试题,需要分两种情况讨论,关键点在于字符串常量池和运行时堆的区别。
Java中,String str=new String("abc");创建了几个对象?"abc"字符串对象时会创建 2 个对象
"abc"这个字面量会被放入方法区的字符串常量池(JDK 7+ 后,常量池移到了堆中)。new String("abc")会在堆内存中创建一个新的String对象,它的内容指向常量池中的"abc"。所以,总共创建了:1个常量池对象 + 1个堆对象 = 2个对象。
"abc"字符串对象时会创建 1 个对象
"abc"字面量或intern()方法)将"abc"放入了常量池,所以此时不会再创建常量池对象。new String("abc")仍然会在堆中创建一个新的String对象。所以,总共创建了:0个常量池对象 + 1个堆对象 = 1个对象。
// 假设程序刚开始运行,常量池是空的Strings1="abc";// 第一次出现"abc",常量池创建1个对象,堆中不创建Strings2=newString("abc");// 常量池已存在"abc",不再创建;堆中创建1个新对象String str = new String("abc");中的"abc"字面量本身会触发常量池对象的创建(如果尚未存在)。new关键字总是会在堆中创建一个新的String对象。String s = "abc";而不是new String("abc"),避免不必要的堆对象创建。最终答案(面试标准回答):
如果字符串常量池中之前没有
"abc",则会创建2个对象(1个在常量池,1个在堆)。
如果常量池中已有"abc",则只会创建1个对象(堆中的新对象)。