我编写了一些代码作为示例:
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 次)。
最佳答案
没有什么区别。 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
添加一些开销。)
关于java - 在java函数内部或外部操作数据,会对性能产生影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39742154/