我编写了一些代码作为示例:
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。
在内存使用方面,它们中的任何一个都比其他的好吗?在函数中拆分字符串会帮助垃圾收集器吗?
就像我说过的,这只是一个很小的例子,真正的代码有巨大的字符串,需要分割,而且它每秒钟都会收到很多这样的字符串。因此,从长远来看,这种差异可能是显而易见的(这是一个需要在100小时以上运行的软件)。
用一种方法还是另一种方法会有什么区别吗?
更新:
这个问题与java how expensive is a method call不一样。
我不是问对方法的调用是否昂贵,而是询问函数内部或外部对String.split();的调用是否有任何不同。
更新2:
如果我有这个怎么办?会不一样吗?
while ((hugeString = br.readLine()) != null) {
splitOutside(hugeString.split(","));
splitInside(hugeString);
}我忘记提到,我经常在一个(几乎)没完没了的循环中从JVM外部阅读(拆分将每秒发生2-10次)。
发布于 2016-09-28 08:51:42
没有什么不同。只有在使用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添加了一些开销。)
发布于 2016-09-28 08:49:17
没有区别,因为同样的操作将被应用。您甚至可以尝试测量所花费的时间,但老实说,这是没有意义的,您根本不应该担心它,您应该担心的是您的设计,以及是否适合传递一个完整的String或一个拆分的String。
https://stackoverflow.com/questions/39742154
复制相似问题