String str1= “i”; 在编译期,JVM会去常量池来查找是否存在“i”,如果不存在,就在常量池中开辟一个空间来存储“i”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“i”在常量池中的地址值。
String str2 = new String("i") ;在编译阶段JVM先去常量池中查找是否存在“i”,如果过不存在,则在常量池中开辟一个空间存储“i”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“i”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。
也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。
String str=“i“与 String str=new String(“i“)一样吗?
最新推荐文章于 2023-02-22 09:08:28 发布
"本文详细解析了Java中使用`String str1 = "i";`和`String str2 = new String("i");`两种方式创建字符串对象时内存的分配情况。前者可能创建一个或零个对象,而后者至少创建一个对象,可能在常量池和堆内存中各有一个。讨论了编译期和运行期的不同处理,并强调了内存区域的区别。"
摘要由CSDN通过智能技术生成