使用StringBuilder的目的是减少内存。完成了吗?
一点都不。该代码未
StringBuilder正确使用。(不过,我认为您的报价有误;
id2和的周围肯定没有引号
table吗?)
请注意,通常的目的是减少内存 流失, 而不是减少使用的总内存,以使垃圾收集器的工作更轻松。
这样占用的内存等于使用如下所示的String吗?
不,这将导致 更多的
内存流失,而不仅仅是您引用的直接连接。(除非/除非JVM优化器认为
StringBuilder代码中的显式内容是不必要的,否则将其优化)。
如果该代码的作者想要使用
StringBuilder(有参数支持,但也有反对;请参见此答案末尾的注释),则最好做得好(在此我假设
id2和之间实际上没有引号
table):
StringBuilder sb = new StringBuilder(some_appropriate_size);sb.append("select id1, ");sb.append(id2);sb.append(" from ");sb.append(table);return sb.toString();请注意,我已经
some_appropriate_size在
StringBuilder构造函数中列出了它,以便它以足够的容量开始要添加的全部内容。如果未指定一个字符,则使用的默认大小为16个字符,通常太小,导致
StringBuilder必须进行重新分配以使其自身变大(IIRC,在Sun
/ Oracle JDK中,它会自身加倍[或更多,如果它知道
append每次用完房间都需要更多满足特定条件。
您可能听说过,如果使用Sun / Oracle编译器进行编译,则字符串连接
将
StringBuilder在幕后使用。的确如此,它将
StringBuilder为整体表达使用一个。但是它将使用默认构造函数,这意味着在大多数情况下,它将不得不进行重新分配。不过,它更容易阅读。请注意,这对于
一系列 串联 不是 正确的。因此,例如,它使用一个: __
StringBuilder
return "prefix " + variable1 + " middle " + variable2 + " end";
它大致翻译为:
StringBuilder tmp = new StringBuilder(); // Using default 16 character sizetmp.append("prefix ");tmp.append(variable1);tmp.append(" middle ");tmp.append(variable2);tmp.append(" end");return tmp.toString();所以没关系,虽然默认的构造函数和随后的重新分配(S)不理想,赔率是它不够好-以及级联是一个 很大 的可读性。
但这仅适用于单个表达式。
StringBuilder为此使用了多个:
String s;s = "prefix ";s += variable1;s += " middle ";s += variable2;s += " end";return s;
最终变成这样的东西:
String s;StringBuilder tmp;s = "prefix ";tmp = new StringBuilder();tmp.append(s);tmp.append(variable1);s = tmp.toString();tmp = new StringBuilder();tmp.append(s);tmp.append(" middle ");s = tmp.toString();tmp = new StringBuilder();tmp.append(s);tmp.append(variable2);s = tmp.toString();tmp = new StringBuilder();tmp.append(s);tmp.append(" end");s = tmp.toString();return s;…这很丑。
但是要记住,重要的是,在几乎所有情况下, 这都无关紧要 ,除非有特定的性能问题, 否则最好选择 可读性(增强可维护性)。



