<分区>
最近发现java.lang.String.substring方法返回的不是新的字符串,而是被子字符串化后的原始字符串的 View 。这可能会影响内存。例如,如果您正在读取一个 ascii 文件,并使用子字符串解析文件中的标记并将子字符串的结果存储在内存中的某处——您实际存储在内存中的是子字符串操作之前的整个字符串!您当然可以通过在您自己的版本中包装子字符串来解决此问题,该版本返回子字符串结果的新字符串。
<分区>
最近发现java.lang.String.substring方法返回的不是新的字符串,而是被子字符串化后的原始字符串的 View 。这可能会影响内存。例如,如果您正在读取一个 ascii 文件,并使用子字符串解析文件中的标记并将子字符串的结果存储在内存中的某处——您实际存储在内存中的是子字符串操作之前的整个字符串!您当然可以通过在您自己的版本中包装子字符串来解决此问题,该版本返回子字符串结果的新字符串。
最佳答案
我曾经被它咬过一次,逐行阅读字典文件。每行都很短,但是 BufferedReader
创建的缓冲区意味着每个字符串都由一个 80 个字符的数组支持。
那是我第一次了解到写作的意义:
word = new String(word);
虽然大多数时候这不是问题 - 当然它可以比“采用完全独立的副本”方法更有效。
关于java - 有多少人被 Java 子串内存问题坑过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036719/