java - Java中如何使用StringBuilder读取大文本文件?

标签 java string io stringbuilder stringbuffer

Java中是否有任何机制可以减少读取大型文本文件时的内存使用量?

我遇到的几乎每个程序都使用 String 来读取文本文件。但是 Java 为每个 String 文字保留了空间。这就是为什么我认为内存使用量会增加,因为所有 String 对象都被存储。 java.io 的所有类都处理 String。但是如果我们不使用 StringBuilder 那么我们如何减少内存使用呢?

毕竟减少内存使用是 StringBuilder 的主要关注点[因为它不像 String 那样是不可变的]。那么我们如何在不使用 String 的情况下在 Java I/O 操作中利用它的特性,即不使用这样的东西: sb.append([String object]);

最佳答案

假设您有 n 个字符串,为简单起见,您从输入中读取每个字符串的长度为 1。

在读取时对字符串使用 operator+ 将会在每次连接字符串时创建一个 String 对象,因此您会得到长度为 1,2,3,... 的字符串,

因此,除了您读取的 n 字符串之外,组合后的字符串的总内存使用量为 1 + 2 + .. + n = O(n^2)来自输入

如果你使用StringBuilder来创建最终的字符串,你实际上会创建n - 用于输入[长度为1的每个]和一个用于最终字符串的对象 - of大小 n,因此总内存使用量为 1 + 1 + .. + 1 + n = O(n)

因此,即使您使用 sb.append(String) - 空间使用量也渐近优于创建所有中间字符串 - 因为您不需要创建中间 String 对象。

此外 - 使用 StringBuilder 时性能 [时间] 应该更好 - 既是因为创建的对象更少,也是因为内存使用量更少 - gc 不需要那么辛苦地工作就像天真地连接字符串时一样。

(*)请注意,很容易看出上面的内容仍然适用于任何长度的字符串。

关于java - Java中如何使用StringBuilder读取大文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9853856/

相关文章:

java - 如果没有 "doing advanced stuff",我可以使这个搜索相关性功能更好吗?

java - 处理、制作模拟时钟、数字

从 txt 文件读取时,C++ 重载流 I/O 运算符

java - 从文件读取文本 IO 异常

java - 保持最大精度水平

java - 需要帮助命名类

javascript - 如何获取字符串的包装器 ID 或类

java - 在java中获取韩语单词的最后一个字符

string - 如何从 Swift 中的路径更改各种重音符号和特殊字符?

c++ - C++中fscanf的正确使用方法