Java 字符串连接所需的变通方法

Java 字符串连接所需的变通方法,java,string,core,Java,String,Core,目前,当javac遇到字符串连接时,它会将代码转换为使用StringBuilder。例如: String a = String.valueOf(System.currentTimeMillis()); String b = String.valueOf(System.currentTimeMillis()); String c = String.valueOf(System.currentTimeMillis()); String d = a + b + c + "_IN

目前,当javac遇到字符串连接时,它会将代码转换为使用StringBuilder。例如:

String a = String.valueOf(System.currentTimeMillis());
    String b = String.valueOf(System.currentTimeMillis());
    String c = String.valueOf(System.currentTimeMillis());
    String d = a + b + c + "_IND";
变得有点像

String d = new StringBuilder().append(a).append(b).append(c).append("_IND");
由于StringBuilder没有显式调整大小,因此会使用默认大小,当默认大小太小时,通常会导致在运行时调用expandCapacity

在分析应用程序时,我们看到了许多这样的操作,例如为各种hashmap构建键,为JSF中的每个元素构建唯一键等等,这会导致额外的内存使用。

有没有更好的办法来减少这种情况

如果您试图在中插入更大的字符串 StringBuilder解释大尺寸的尺寸总是明智的 字符串并初始化您的StringBuider 估计大小作为其默认容量

推导一个专门的公式来计算StringBuilder的初始容量,以便控制低估和高估尺寸的成本


因为StringBuilder以字符数组的形式存储正在生成的字符串。StringBuilder的容量是此数组的长度。一旦数组溢出,就会分配一个新的(更长的)数组并将内容传输到该数组。这会使容量增加。

由于您只添加currentTimeMillis,您对StringBuilder的大小有了初步的了解吗?类似于新的StringBuilder(System.currentTimeMillis().toString().length*3+4)不,这只是一个例子,每次他们使用StringBuilder时,你都可以使用任何东西来浓缩,这可能是井的重复,不是很明显吗?使用StringBuilder,并为其指定适当的大小。如果你说你不知道大小,那么没有魔法可以阻止自动调整大小。注意:它不会导致额外的内存使用——但会产生更多的垃圾。您没有提供关于用例的太多信息,但是如果这导致了问题,您可能希望重新设计应用程序的这一部分,使其不太依赖字符串。