Java 在StringBuilder上追加或添加ArrayList<;字符串>;?

Java 在StringBuilder上追加或添加ArrayList<;字符串>;?,java,arraylist,stringbuilder,Java,Arraylist,Stringbuilder,或 List line=ArrayList(); while(从文件中读取行){ 行。添加(行); } 以上哪项更有效?这取决于你下一步做什么。就性能而言,ArrayList获胜,因为它只分配了几次指向现有字符串的指针。StringBuffer可能需要更少的内存,但它会复制所有字符串(有时在需要扩展缓冲区时会复制自己),因此速度较慢 我说“可能需要更少的内存”,因为每次缓冲区满时,它的大小都会翻倍。假设缓冲区为1024,其中包含1020个字符,您需要再添加5个字符。这意味着它现在需要2048个

List line=ArrayList();
while(从文件中读取行){
行。添加(行);
}

以上哪项更有效?

这取决于你下一步做什么。就性能而言,
ArrayList
获胜,因为它只分配了几次指向现有字符串的指针。
StringBuffer
可能需要更少的内存,但它会复制所有字符串(有时在需要扩展缓冲区时会复制自己),因此速度较慢

我说“可能需要更少的内存”,因为每次缓冲区满时,它的大小都会翻倍。假设缓冲区为1024,其中包含1020个字符,您需要再添加5个字符。这意味着它现在需要2048个字符(而不是1025个字符),因此它“浪费”了1023个字符


列表的大小也会翻倍,但由于项目可能更小(此语句取决于平均行长度),因此通常需要更少的内存。同时,复制列表中较小的指针速度更快(每次列表的内部数组满时都会发生这种情况)。

StringBuilder在大多数情况下内存效率更高

使用ArrayList可以将所有字符串保留在内存中,使用StringBuilder可以只保留字符数组中的字符,因为实际字符串将被GCed。因此,如果您有10000个字符串,那么您就有10000*的内存差。字符串与其对应的字符(字符串类本身中的对象,如锁、长度、哈希等)之间的内存差


需要注意的是,StringBuilder也会稍微慢一点;与计算机科学中的一切事物一样,CPU和内存之间也存在权衡。

数组列表应具有更多内存占用,因为默认情况下,ArrayList将为10个对象保留内存,而stringbuilder不会。由于附加到stringbuilder或添加到arraylist的string对象将占用相同的内存,不同之处在于未使用arraylist创建的保留空间


就可访问性而言,与StringBuilder相比,arraylist提供了更多的选项

您不会注意到任何区别,我不会浪费时间去考虑。嗯,StringBuilder?????StringBuilder是一个字符数组(原语),因此它比字符串数组(对象)占用更少的内存。
StringBuilder sb = new StringBuilder();

while (read line from File) {

sb.append(line).append("\n");

}
List <String> lines = ArrayList<String>();

while (read line from File){

lines.add(line);

}