目前,当javac遇到String连接时,它会将代码转换为使用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。
在分析应用程序时,我们看到了很多这样的操作,例如构建各种HashMaps的密钥,为JSF中的每个元素构建唯一的密钥等,这会导致额外的内存使用。
有没有更好的方法来减少这种情况。
答案 0 :(得分:2)
如果您尝试在其中插入更大的字符串 StringBuilder总是可以理解大的大小 字符串并初始化您的StringBuider与更多 估计大小作为其默认容量。
推导出一个经验公式,为StringBuilder提供初始化能力,以便控制不足和过高估计尺寸的成本。
因为StringBuilder以char数组的形式存储正在构建的字符串。 StringBuilder的容量是此数组的长度。一旦数组溢出,就会分配一个新的(更长的)数组,并将内容传输给它。这使得容量上升。