这两个Java代码中哪一个更快?

这两个Java代码中哪一个更快?,java,memory-management,heap-memory,Java,Memory Management,Heap Memory,从理论上和实践上看,哪种代码更快: class ABC{ File file; void method(){ file = new File(); } } 或 其中,类ABC仅实例化一次。但是该实例的方法被多次调用。注意:我知道在这种情况下,速度实际上是不相关的。性能差异不太重要 在第一个版本中,在下一次调用方法之前,将有一个对File对象的有效引用,但是在替换之前的对象之后,仍然需要对其进行垃圾收集。在第二个版本中,File对象在方法完成时成为

从理论上和实践上看,哪种代码更快:

class ABC{
    File file;

    void method(){   
        file = new File();
    }
}


其中,类ABC仅实例化一次。但是该实例的方法被多次调用。注意:我知道在这种情况下,速度实际上是不相关的。

性能差异不太重要

在第一个版本中,在下一次调用方法之前,将有一个对File对象的有效引用,但是在替换之前的对象之后,仍然需要对其进行垃圾收集。在第二个版本中,File对象在方法完成时成为孤立对象,可以进行垃圾收集

因此,第一个版本意味着,只要ABC实例存在,内存中就会始终保留至少一个不可收集的文件对象。不过,这不太可能是个大问题,除非文件消耗了不可忽略的内存量,否则它只包含文件的路径和名称。缓冲文件内容是BufferedReader的工作,您可以保留大量ABC实例


不过,您应该担心的是代码的清晰性。一般规则是,每个变量都应该具有尽可能小的范围。如果它可以是局部变量,那么它应该是局部变量。原因是作用域越小,可能影响其值的代码就越少,这使得应用程序更容易调试。当您遇到一个错误,文件突然没有得到您期望的值时,您只需要检查一个方法,而不是整个类。

性能差异不太重要

在第一个版本中,在下一次调用方法之前,将有一个对File对象的有效引用,但是在替换之前的对象之后,仍然需要对其进行垃圾收集。在第二个版本中,File对象在方法完成时成为孤立对象,可以进行垃圾收集

因此,第一个版本意味着,只要ABC实例存在,内存中就会始终保留至少一个不可收集的文件对象。不过,这不太可能是个大问题,除非文件消耗了不可忽略的内存量,否则它只包含文件的路径和名称。缓冲文件内容是BufferedReader的工作,您可以保留大量ABC实例


不过,您应该担心的是代码的清晰性。一般规则是,每个变量都应该具有尽可能小的范围。如果它可以是局部变量,那么它应该是局部变量。原因是作用域越小,可能影响其值的代码就越少,这使得应用程序更容易调试。当您遇到一个错误,文件突然没有得到您期望的值时,您只需要检查一个方法,而不是整个类。

最后我得到了一个方向。不是在stackoverflow上,而是在Quora上。在这里查看Cameron Purdy的答案。

我终于找到了方向。不是在stackoverflow上,而是在Quora上。请在此处查看Cameron Purdy的答案。

无论在哪种情况下,此代码都不起任何作用。您将很难准确地测量时间,更不用说差异了。如果您需要将文件作为实例字段,请将其设置为实例字段。如果您只在该方法中需要它,请使用局部变量。速度是无关紧要的。@JaroslawPawlak您认为什么更快?每次第二个代码时在堆内存的末尾添加一个新引用,或者每次第一个代码时都扫描过去创建的引用所在的位置?您感到困惑了。这两个代码使方法内部成为新的,因此这两个代码在堆中添加了一个新对象。唯一不同的是引用此对象的变量存储在何处。一个将其与对象实例的其他数据一起存储,另一个将其存储在堆栈上。这两个都是内存,所以基本上都是相同的速度。@kumesana我并没有询问在每种情况下访问文件实例所需的时间。我只是问了在多次调用该方法时执行该方法所需的时间。这段代码在这两种情况下都不起作用。您将很难准确地测量时间,更不用说差异了。如果您需要将文件作为实例字段,请将其设置为实例字段。如果您只在该方法中需要它,请使用局部变量。速度是无关紧要的。@JaroslawPawlak您认为什么更快?每次第二个代码时在堆内存的末尾添加一个新引用,或者每次第一个代码时都扫描过去创建的引用所在的位置?您感到困惑了。这两个代码使方法内部成为新的,因此这两个代码在堆中添加了一个新对象。唯一不同的是引用此对象的变量存储在何处。一个将其与对象实例的其他数据一起存储,另一个将其存储在堆栈上。这两个都是内存,所以基本上都是相同的速度
it’在每种情况下,都不会询问访问文件实例所需的时间。我只询问了在多次调用该方法时执行该方法所需的时间。这似乎与这里提出的问题不同,2。stackoverflow上的答案应该自己提供答案,而不仅仅是链接到其他提供答案的网站。见1。这似乎与这里提出的问题不同,2。stackoverflow上的答案应该自己提供答案,而不仅仅是链接到其他提供答案的网站。看见
class ABC{

    void method(){
        File file = new File();
    }
}