我已经查看了java substring方法的所有内存泄漏解决方案。由于此问题,我仍然会出现内存不足错误。我有一个字符串的arraylist,长度为1000-3500。我索引它们并存储它们。问题是每个字符串都需要通过循环来运行,以存储相同字符串的所有可能不同长度。为此,我使用循环和子串方法。而这种方法会导致内存泄漏问题。
我做过的sudo代码:
for(int i=0;i<str.length;i++)
{
//create substring and index it
str.substring(0,(str.length()-i));
}
str:string。并且上面的循环运行直到arraylist中的所有字符串都被索引。我试图修复泄漏,
1
for(int i=0;i<str.length;i++)
{
//create substring and index it
new String(str.substring(0,(str.length()-i)));
}
2
for(int i=0;i<str.length;i++)
{
//create substring and index it
new String(str.substring(0,(str.length()-i)).intern());
}
3
for(int i=0;i<str.length;i++)
{
//create substring and index it
new String(str.substring(0,(str.length()-i))).intern();
}
我还有这个问题。我的java版本是:1.7.0_17。
编辑:
我理解这不是评论中的内存泄漏问题。我正在索引一些连续的字符串。比如说,
String s= abcdefghijkl;
我想将每个字符串索引为:
abcdefghjk
abcdefghj
abcdefhg
abcdefh
abcdef
abcde
abcd
..
..
a
要执行此操作,我会得到一个字符串,然后执行子字符串操作,获取该字符串并将其编入索引。
答案 0 :(得分:4)
没有泄漏。
请注意,您正在创建大量String
个对象。如果String
的长度为1000个字符,那么您将创建1000个对象。
是否真的需要创建这么多String
个对象?例如,是否可以使用char[]
来实现您想要的内容?
答案 1 :(得分:1)
有两件事:
首先:“。intern()”将字符串保存在通常不会被垃圾收集的内部缓存中 - 如果您不能100%确定使用它,请不要使用它。
第二:String中的构造函数使用char []:
final char[] chars = str.toCharArray ();
for(int i=0;i<chars.length;i++)
{
//create substring and index it
new String(chars, 0, chars.length-i);
}
- &GT;这也更有效(就速度而言)
答案 2 :(得分:1)
通过返回字符数组的新副本,在JDK 1.7中修复了此问题。
public String(char value[], int offset, int count) {
//check boundary
// It return new copy on array.
this.value = Arrays.copyOfRange(value, offset, offset + count);
}
public String substring(int beginIndex, int endIndex) {
//check boundary
int subLen = endIndex - beginIndex;
return new String(value, beginIndex, subLen);
}