java - 在java函数内部或外部操作数据,会对性能产生影响吗?

标签 java function memory-management garbage-collection

我编写了一些代码作为示例:

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("");
        }
}

在本例中,我有两个不同的函数:splitOutsidesplitInside

在内存使用方面,其中任何一个比另一个更好吗?在函数内分割字符串对垃圾收集器有帮助吗?

正如我所说,这只是一个小例子,真正的代码有大量的字符串需要拆分,并且每秒都会收到许多这样的字符串。因此,从长远来看,差异可能会很明显(该软件需要运行超过 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/

相关文章:

iPhone App 切换后崩溃,可能是由于 UIImage imageNamed

python - Django:我的函数返回一个对象而不是返回值

php - 为什么我的 PHP 函数没有产生任何输出?

ios arc迁移项目presentViewController后内存清理

java - 构建失败,出现异常 react native

复杂随机点生成

c++ - 为维数增加(点数)的点云分配 CUDA 设备内存

java - 无法在 Android 中导入 com.google.cloud.speech.v1.SpeechGrpc

Java Swing mousePressed 和 getSource() 未在 JPanel 上显示绘制的形状

java - 适用于 500 多个航路点/节点的最短路径算法(例如 Dijkstra 算法)?