我用了一些代码作为例子:
public class Main {
public static void main(String[] args) {
String hugeString = "a,a,a,a";
splitOutside(hugeString.split(","));
splitInside(hugeString);
}
private static void splitInside(String string) {
String splitData[] = string.split(",");
for (int i = 0; i < splitData.length; i++){
System.out.print(splitData[i]);
}
System.out.println("");
}
public static void splitOutside(String[] splitData) {
for (int i = 0; i < splitData.length; i++){
System.out.print(splitData[i]);
}
System.out.println("");
}
}
在这种情况下,我有两个不同的功能,splitOutside
和splitInside
。
在内存使用方面,这些是否优于其他?将函数内部的字符串拆分有助于垃圾收集器吗?
正如我所说,这只是一个很小的例子,真正的代码有巨大的字符串需要分割,并且它每秒都会收到许多这些strins。因此从长远来看差异可能是显而易见的(这是一个需要在100多个小时内开启的软件)。
使用一种方法或另一种方法会有所作为吗?
更新:
此问题与java how expensive is a method call不同。
我不是在问一个方法的调用是否昂贵,我问的是函数内部或外部对String.split();
的调用是否有任何区别。
更新2:
如果我有这个怎么办?它会有所不同吗?
while ((hugeString = br.readLine()) != null) {
splitOutside(hugeString.split(","));
splitInside(hugeString);
}
我忘了提到我经常在(几乎)无限循环中从JVM外部读取(分裂将每秒发生2-10次)。
答案 0 :(得分:2)
没有区别。 hugeString.split(",")
的结果只有在使用它的方法完成后才能到达,因为这是接收引用的代码的唯一部分。 splitInside
方法也是如此。
为了减少占用空间,最好不要将整个数组保留在内存中,而是一个接一个地找到子字符串:
private static final Pattern PATTERN = Pattern.compile("[^,]*");
private static void splitInside(String string) {
Matcher matcher = PATTERN.matcher(string);
while (matcher.find()) {
System.out.print(matcher.group());
}
System.out.println();
}
请注意,此处一次只能引用一个子字符串,而不是一次引用所有子字符串。 (您为Pattern
/ Matcher
添加了一些开销。)
答案 1 :(得分:0)
没有区别,因为无论如何都将采用相同的操作。你甚至可以尝试测量所花费的时间,但说实话,这是毫无意义的,你根本不应该担心它,你应该担心的是你的设计以及是否适合传递一个完整的{{1或者分割String
。