代码之家  ›  专栏  ›  技术社区  ›  Amir Afghani

有多少人被Java子串内存问题刺痛?[关闭]

  •  3
  • Amir Afghani  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

    我曾经被它咬过一次,一行一行地读字典文件。每行都很短,但是缓冲区是由 BufferedReader 这意味着每个字符串都有一个80个字符的数组作为后盾。

    那是我第一次学会写作的时候:

    word = new String(word);
    

    大多数时候这不是问题-当然了 可以 比“完全独立复制”方法更有效。

        2
  •  1
  •   oxbow_lakes    15 年前

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

    真正令人恼火的是如果一篇文章

    String copy = new String(s);
    

    Intellij理念警告我这是多余的!愚蠢的IDE。

        3
  •  0
  •   Community George Stocker    7 年前

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

    在Java文档中,它声明子串方法确实返回一个新的字符串。

    还是我误解了这个问题?

    此外,字符串是不可变的。 Here's a SO thread that explains why that is so.