无聊的时候想起耍的?不知道对不对!关于String拼接的问题

String a = "a" + "b";

这个过程中生成了几个对象?

我个人觉得是2个 理由等下说 不知道对不对

0个或1个,编译过程会把"a"+"b"合并,如果原来有"ab",则不会创建,如果原来没有,则会创建一个

会不会是0个或3个呢,我想

你现在的a和b是常量,编译器就有了,分配一个a变量就好了

             String a = "a" + "b";
0000005d  mov         eax,dword ptr ds:[036220B0h] 
00000063  mov         dword ptr [ebp-44h],eax 

初始化a的时候,字符串a和b作为常量,所以只有a一个对象。

为什么不是三个呢 String类型的不是对象吗

只创建了一个对象a,字符ab是存储在常量池中的。javap可以看到这行代码执行的是ldc字节码。
图片说明

仔细想了下,应该是一个对象都没有创建,因为反编译代码中根本没有new操作,本质上定义的String a还是一个常量串。

如果是常数,编译器可以优化的。如果是变量,那么需要3个。

1个。是由最后生成的那个是创建的对象,数据源两个都是常量对象,是编译的时候已经生成的。

int a = 1 + 2;
会产生几个int呢?

程序的内存分配:
1、栈区(stack)
2、堆区(heap)
3、全局区(静态区)(static)
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。