Java 字处理性能:ArrayList.toArray()或StringBuilder.split()

Java 字处理性能:ArrayList.toArray()或StringBuilder.split(),java,performance,Java,Performance,我正在将换行符分隔的文本文件读入字符串-数组 因为我知道分隔符总是\n,所以我应该能够将每个单词附加到StringBuilder,然后使用分隔符拆分它 简单地说,我应该使用哪种方法?为什么 方法A: 1.创建ArrayList(或其他更合适的集合) 2.将每行追加到列表中 3.Returnlist.toArray() 方法B: 1.创建StringBuilder 2.将每行追加到生成器 3.Returnbuilder.split(“\n”)可能差别不大。我不认为你正在处理非常大的文件,所以这不重

我正在将换行符分隔的文本文件读入
字符串
-数组

因为我知道分隔符总是
\n
,所以我应该能够将每个单词附加到StringBuilder,然后使用分隔符拆分它

简单地说,我应该使用哪种方法?为什么

方法A:
1.创建ArrayList(或其他更合适的集合)
2.将每行追加到列表中
3.Return
list.toArray()

方法B:
1.创建StringBuilder
2.将每行追加到生成器

3.Return
builder.split(“\n”)

可能差别不大。我不认为你正在处理非常大的文件,所以这不重要。如果你真的对它感兴趣,你可以用不同的方式描述它,但是你所做的选择是完全不相关的


如果这是我的选择,我会选择
ArrayList
方式,因为仅用于事后拆分的串联似乎是多余的。

等等,如果您读取的是以下格式的文件:

A
B
C
D
E
F
为什么不同时阅读和保存呢

比如:

BufferedReader bufferedReader = new BufferedReader(new FileReader("test.txt"));
List<String> lines = new ArrayList<String>();

for (String line; (line = bufferedReader.readLine()) != null; )
{
    lines.add(line);
}

System.out.println(lines);
BufferedReader BufferedReader=new BufferedReader(new FileReader(“test.txt”);
列表行=新的ArrayList();
for(字符串行;(line=bufferedReader.readLine())!=null;)
{
行。添加(行);
}
系统输出打印项次(行);

您将在
行中有
[A,B,C,D,E,F,G]
列表中有
不确定它有多大区别,由于
字符串处理较少,
toArray
方法很可能更快。
split
必须使用regex处理整个数据;
toArray
方法只需在
集合上循环即可

如果修改方法B,使您不必逐行将文件读取到
StringBuilder
中,而是使用将整个文件作为
字符串来获取,那么
split
可能会发现性能大致相同

如果您有Java 8:

final Path path = /*some path*/
final String[] lines = Files.lines(path).toArray(String[]::new);
注意,可以通过使用
文件改进方法A。readAllLines

final String[] lines = Files.readAllLines(path, StandardCharsets.UTF_8).
    toArray(new String[0]);

结果必须是字符串数组。在处理所有元素之前,无法知道它的大小,因此在处理时无法添加元素。
lines.toArray()
;--关于“处理时不添加”我需要的信息。相对较大(>100.000)。我同意ArrayList更漂亮,看起来更健壮,只是对性能好奇而已。:)好吧,LinkedList可以为您节省调整基础数组大小的时间。100000行甚至不是相对较大的。ArrayList具有相同的数组限制,但它非常大(Integer.MAX_INT),如果您的列表真的很长,可能您需要一个LinkedList。@Marcacierno问题是ArrayList会随着内部数组的增长而调整大小(除非您在创建时用足够大的大小初始化它)。我已经推荐了LinkedList,因为它不需要调整大小(数组的最大长度在这里不是一个真正的问题)。我使用ArrayList和LinkedList对该过程进行了基准测试,令人惊讶的是,LinkedList平均花费了ArrayList时间的1,5-2倍(多次运行)。您最好从该方法返回列表,而不是从数组返回。但是,无论您使用什么,大部分时间都将用于读取文件,而不是处理字符串/列表。与在内存中转换内容相比,从磁盘读取文件的速度非常慢。