簡體   English   中英

文字處理性能:ArrayList.toArray()或StringBuilder.split()

[英]Word processing performance: ArrayList.toArray() or StringBuilder.split()

我正在將換行符分隔的文本文件讀取為String -array。

由於我知道定界符將始終為\\n ,因此我應該能夠將每個單詞附加到StringBuilder,然后使用定界符對其進行拆分。

簡而言之,我應該使用哪種方法,為什么?

方法A:
1.創建一個ArrayList(或另一個更合適的Collection)
2.將每一行追加到列表中
3.返回list.toArray()

方法B:
1.創建一個StringBuilder
2.將每一行追加到構建器
3.返回builder.split("\\n")

不確定是否有很大的區別,因為較少的String處理,所以toArray方法很可能會更快。 split將不得不使用正則表達式處理所有數據; toArray方法只需要遍歷Collection

如果修改方法B,以便不將文件逐行讀取到StringBuilder而是使用Files.readAllBytes將整個文件作為String獲取,則split您可能會發現性能Files.readAllBytes相同。

如果您有Java 8:

final Path path = /*some path*/
final String[] lines = Files.lines(path).toArray(String[]::new);

注意,可以通過使用Files.readAllLines來改進方法A

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

可能差別很小。 我認為您無論如何都不會處理非常大的文件,所以沒關系。 如果您確實對它感興趣,可以使用不同的方法來進行描述,但是您所做的選擇是無關緊要的。

如果可以選擇,我會采用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);

您的lines List中將有[A, B, C, D, E, F, G]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM