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倍(多次运行)。您最好从该方法返回列表,而不是从数组返回。但是,无论您使用什么,大部分时间都将用于读取文件,而不是处理字符串/列表。与在内存中转换内容相比,从磁盘读取文件的速度非常慢。