Java中StringBuilder的append方法是如何工作的,以及为什么作为参数传递给它的字符串不会在内存中创建一个新的字符串对象

问题描述 投票:0回答:1
StringBuilder sb = new StringBuilder("mainWord");
sb.append("secondWord" + "thirdWord");
System.out.println(sb);

这里的append方法接受一个String作为参数。我的问题是,这怎么不为堆中的这个 String 分配内存?

String 和 StringBuilder 的区别在于,String 会在内存中创建新对象,而 StringBuilder 则不会。但是,append 方法仍然接受 String 作为参数,逻辑上应该将其存储在内存中的某个位置。

java string stringbuilder
1个回答
0
投票
StringBuilder sb = new StringBuilder("mainWord");
sb.append("secondWord" + "thirdWord");
System.out.println(sb);

编译时,对于“mainword”,编译器会阻塞静态初始化的内存。它不在堆上。它会对“secondWord”和“thirdWord”执行相同的操作,但足够聪明,可以意识到将两个常量相加总是会产生相同的结果。因此它直接执行计算并为“secondWordthrirdWord”分配内存。它不在堆上。

在运行时,StringBuilder 用“mainWord”初始化。这时候引用就传递过去了,Java足够聪明,不会复制整个String。 当使用另一个字符串调用append时,再次传递一个引用。但现在 StringBuilder 意识到它需要复制这两个数据。因此,它在堆上保留一些内存并复制其中两个字符串的内容 - 在堆上创建第一个缓冲区对象。

© www.soinside.com 2019 - 2024. All rights reserved.