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/