3

我最近发现 java.lang.String.substring 方法不返回一个新字符串,而是返回一个被子字符串化的原始字符串的视图。这可能会影响记忆。例如,如果您正在读取一个 ascii 文件,并使用 substring 解析文件中的标记并将 substring 的结果存储在内存中的某个位置 - 您实际上存储在内存中的是子字符串操作之前的整个字符串!您当然可以通过将子字符串包装在您自己的版本中来解决这个问题,该版本返回子字符串结果的新字符串。

4

3 回答 3

11

我被它咬过一次,逐行阅读字典文件。每行都很短,但创建的缓冲区BufferedReader意味着每个字符串都由一个 80 字符数组支持。

那是我第一次了解写作的意义:

word = new String(word);

大多数情况下,这不是问题——当然,它比“获取完全独立的副本”方法更有效

于 2009-06-24T06:41:21.893 回答
1

在 2000 年或 2001 年,早期的XML解析器之一(我不记得是哪个)遇到了这个问题。我们花了一些时间通过阅读一些早期的大约 3 个字段(描述金融产品的FpML非常大的文档)来追踪我们是如何失去记忆的。XML

真正烦人的是,如果写

String copy = new String(s);

IntelliJ IDEA 警告我这是多余的!愚蠢的IDE。

于 2009-06-24T06:47:58.683 回答
0

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html

在 java 文档中,它声明 substring 方法确实返回了一个新字符串。

还是我误解了这个问题?

此外,字符串是不可变的。 这是一个 SO 线程,解释了为什么会这样。

于 2009-06-24T06:39:32.643 回答