String.split()的内存问题

Myt*_*Pro 5 java memory string

我的程序目前存在内存问题,在检查应用程序时,我们发现该String.split()方法使用了大量内存.我尝试使用过StreamTokenizer,但似乎这会使事情变得更加复杂.

是否有更好的方法将long拆分StringsStrings使用比String.split()方法更少的内存?

ass*_*ias 0

Split 不会创建全新的字符串,它substring在内部使用它创建一个String指向原始字符串的右侧子字符串的新对象,而不复制底层的char[].

因此,除了对象创建的(轻微)开销之外,从内存的角度来看,它不应该产生巨大的影响。

ps:StringTokenizer使用相同的技术,因此它可能会产生与 split 相同的结果。

编辑

要查看情况是否如此,您可以使用下面的示例代码。它分割abc,defabc打印原始字符串和分割字符串的def底层char[]- 输出显示它们都是相同的。

输出:

Reference: [C@3590ed52  Content: [a, b, c, ,, d, e, f]
Reference: [C@3590ed52  Content: [a, b, c, ,, d, e, f]
Reference: [C@3590ed52  Content: [a, b, c, ,, d, e, f]
Run Code Online (Sandbox Code Playgroud)

代码:

public static void main(String[] args) throws InterruptedException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    String s = "abc,def";
    String[] ss = s.split(",");
    Field f = String.class.getDeclaredField("value");
    f.setAccessible(true);
    System.out.println("Reference: " + f.get(s) + "\tContent: " + Arrays.toString((char[])f.get(s)));
    System.out.println("Reference: " + f.get(ss[0]) + "\tContent: " + Arrays.toString((char[])f.get(ss[0])));
    System.out.println("Reference: " + f.get(ss[1]) + "\tContent: " + Arrays.toString((char[])f.get(ss[1])));
}
Run Code Online (Sandbox Code Playgroud)