您的问题的答案取决于实现,并且具有误导性。在代码片段的末尾可能有 2 到 4 个“字符串对象”,具体有多少取决于 JVM,以及它对小字符串的执行程度(如果有的话)。正如已经指出的 JDK 文档指定 String.toString() 返回对象,所以答案应该是“2 或 3”;但是,依赖这种行为是非常愚蠢的。
我说这具有误导性的原因是您从不关心“字符串对象的数量”。Java 中的对象重量非常轻,您从不担心计算它们。
我要补充的唯一条件是,虽然您从不关心对象计数,但您确实关心引用。在字符串的情况下,一个令人讨厌的惊喜可能是对底层 char 数组的引用数量。字符串对象是共享 char 数组的享元,忘记这一点会导致严重的内存泄漏。用尽 java 程序堆的一种非常简单的方法是:
while(!multiGBFileEOF) {
String bigString = readMultiMBString();
int index = findSmallFeature(bigString);
String featureOfInterest = bigString.substring(index, index+4);
featureList.add(featureOfInterest);
}
featureList 最终应该最多只有几个 10KB(每个 ~1000 个列表项 *(arrayref 4-8 个字节 + 对象 12-20 个字节 + char 数组 8-16 个字节),即微不足道。但是因为一些常见的 JVM 实现共享由 substring() 生成的字符串的后备数组,这最终可能会尝试将整个文件存储在内存中。解决方案是通过调用来强制底层数组的显式副本String copy = new String(featureOfInterest)
。这里你不关心ifcopy
和featureOfInterest
是否是同一个对象,只要copy
不给 char 后面的数组起别名bigString
。
祝你学习顺利。