Java - 我应该在哪里初始化变量以获得内存效率?

时间:2013-04-21 12:43:40

标签: java performance variables memory

内存是否可以初始化一个将被频繁调用的方法中的变量? 基本上,这个示例方法是:

int amount;
private boolean method() {
    amount = Random.nextInt(0, 100);
    return amount == 50;
}

在此方法的内存效率方面更多/更少/相同:

private boolean method() {
    int amount = Random.nextInt(0, 100);
    return amount == 50;
}

是的,我知道这些不是最好的例子,而且它们有一些冗余。对不起。

无论如何,提前谢谢。

5 个答案:

答案 0 :(得分:8)

效率的差异(如果有的话)极有可能完全无关紧要。如果amount不需要在方法之外可见,则更喜欢第二个版本,因为它没有不必要的副作用并且是线程安全的。

要扩展最后一点,如果多个线程在同一个对象上调用method(),则第一个版本对竞争条件开放。

答案 1 :(得分:4)

来自 Effective Java(第2版)

永远不要为表现牺牲合理的架构原则(例如信息隐藏)。

  

第55项:明智地优化

     
    
        
  • 不要为了表现而牺牲合理的建筑原则。努力编写好的程序,而不是快速的程序。
  •     
  • 良好的程序体现了信息隐藏的原则:在可能的情况下,它们在单个模块中本地化设计决策,因此可以在不影响系统其余部分的情况下更改个人决策。
  •     
  

  

第45项:最小化本地变量的范围

     
    

通过最小化局部变量的范围,可以提高代码的可读性和可维护性,并降低出错的可能性。

         

较旧的编程语言,例如C,要求必须在块的头部声明局部变量,并且一些程序员继续习惯这样做。这是一个值得打破的习惯。作为温和提醒,Java允许您在声明合法的任何地方声明变量。

         
        
  • 首先使用最强大的技术来最小化声明它的局部变量的范围。

  •     
  • 几乎每个局部变量声明都应包含一个初始值。

  •     
  

所以最好的方法似乎是第二种方法。

答案 2 :(得分:1)

如果您不需要在其他方法中使用它,第二种方法会更好;由于在堆栈上分配的方法内部的变量非常快,因此性能不是问题。

然而,在您的特定情况下,这种方法会更好,并且一个好的IDE会建议它:

private boolean method() {    
    return Random.nextInt(0, 100) == 50;
}

答案 3 :(得分:0)

我不会真的担心内存效率,因为我担心并发访问导致的错误。

    return amount == 50;

当在多个实例中使用此类时,实例变量amount可能会有所不同。没有适当的记忆障碍,这将导致错误的结果。如果方法完成,则int超出范围,如果它是局部变量。

说到这,为什么这里需要一个变量呢?这不会吗?

return Random.nextInt(0, 100) == 50;

答案 4 :(得分:0)

局部变量是方法的内部变量。最好保持每个变量的范围尽可能小。但是,如果多个方法需要访问变量,则定义实例或类变量。