文章目录
理论解释
java中对于字符串的拼接,存在常量和常量,常量和变量,变量和变量的三种情况的拼接,其次JVM的优化与否(针对常量和常量的拼接来说)也对创建的对象个数有关。
提示:以下是本篇文章正文内容,下面案例可供参考
一、常量和常量的拼接
String str1=“a”+"b"和String str2=new String(“a”+“b”)
因为这种情况是常量之间相加,经过编译器优化成了String str1 = “ab”,放在字符串常量池中,所以答案是创建了一个对象。如果不考虑优化的情况下,这一共是创建了3个对象的,因为一个双引号就是一个字面量(对象)。同时要考虑字符串常量池中是否存在a,b,ab。
在JVM优化情况下会产生1或2个对象,其中 new String() 必然在 堆中产生一个对象,“a” + “b” 在编译阶段由常量优化为 “ab”,若常量池存在则复用,若不存在则创建;在没有优化的情况下且常量池中并不存在a,b,ab,会产生4个对象,分别是常量池中的a,b,ab,new String(),在堆中分配内存,里面存着这字符串"ab"在字符串常量池中的地址,同时str2 存储在栈中,里面存储着指向堆中new String()的地址。
String str3="ab"和String str4 =new String(“ab”)
如果以 String str3=“ab"这种方式创建字符串,则产生零个或一个对象,即字符串常量池中的"ab”,栈中的str3中存储着直接指向字符串常量池中的"ab"的地址值。
以 String str4=new String(“ab”)方式来创建对象,则产生一个或两个对象,一个对象是:new关键字在堆空间创建的;另一个对象是:字符串常量池中的对象"ab"。 (如果前后文中还有代码,并且已经有 ab 常量在常量池存在时,ab 将不再创建,因为在常量池只能存在一份相同的对象)
二、常量和变量的拼接
String str5=“a”+new String(“b”)
对象1: new StringBuilder()
对象2: 常量池中的"a"
对象3: new String(“b”)
对象4: 常量池中的"b"
对象5 :new String(“ab”)–StringBuilder执行toString方法,创建String对象完成拼接
注:StringBuilder 的 toString() 的调用,在字符串常量池中,没有生成"ab"。
如果前后文中还有代码,并且已经常量在常量池存在时,相同的常量 将不再创建,因为在常量池只能存在一份相同的对象。
结论是至多是5个对象。
String str6=new String(“a”) + new String(“b”)
对象1: new StringBuilder()
对象2: new String(“a”)
对象3: 常量池中的"a"
对象4: new String(“b”)
对象5: 常量池中的"b"
对象6 :new String(“ab”)
结论是至多是6个对象。
补充
难道不应该是两个吗?
这道题还未搞懂,直接拷贝的别的博主的,希望大佬们能解答!!!