0

A级

Class A {
    public HashMap <Integer,Double> myHashMap;

public A(){
    myHashMap = new HashMap()
}
}

B类

Class B {
    private A anInstanceOfA;

public B(A a) {
    this.anInstanceOfA = a;
}


aMethod(){  
     anInstanceOfA.myHashMap.get(1); <--getting hashmap value for key = 1

      //proceed to use this value, but instead of storing it to a variable
      // I use anInstanceOfA.myHashMap.get(1) each time I need that value.
}

aMethod()anInstanceOfA.myHashMap.get(1)用来获取key = 1. 我多次这样做,我想知道多次使用或只是将其分配给变量并多次使用分配的变量aMethod()之间是否存在效率差异。anInstanceOfA.myHashMap.get(1)

IE

aMethod(){
     theValue = anInstanceOfA.myHashMap.get(1);

     //proceed to use theValue in my calculations. Is there a difference in efficiency?
}
4

4 回答 4

4

从理论上讲,JVM 可以将差异优化得非常小(与程序的其余部分相比)。但是我更喜欢让它成为一个局部变量,因为我相信它会使代码更清晰(因为我可以给它一个有意义的名字)

我建议你做你认为更简单、更清晰的事情,除非你测量了性能差异。

于 2013-05-06T06:05:45.920 回答
2

问题似乎是您想知道多次调用 get(l) 而不是一次调用是否更昂贵。

答案是肯定的。问题是这是否足够重要。确定的答案是通过 profiling 询问 JVM。但是,您可以通过查看所选实现中的 get 方法来猜测,并考虑是否每次都要做所有这些工作。

请注意,您可能希望将值放入变量中还有另一个原因,即您可以给它一个有说服力的名称,从而使您的程序在将来更易于维护。

于 2013-05-06T06:10:21.503 回答
0

这似乎是一种微优化,实际上并没有对事物的方案产生太大影响。

正如@peter 已经建议的那样,“优化”样式/可读性是选择第二个选项而不是第一个选项的更好理由。仅当您确实进行了很多调用,或者调用非常昂贵时,才开始对速度进行优化——这两种情况在您当前的示例中可能都不是这样。

于 2013-05-06T06:10:08.470 回答
0

出于多种原因,将其放入局部变量中:

  • 它会快得多。读取局部变量肯定比 HashMap 查找便宜,可能是 10-100 倍。
  • 你可以给局部变量一个好的、有意义的名字
  • 您的代码总体上可能会更短/更简单,特别是如果您多次使用局部变量。
  • 如果有人修改了其中一个调用但忘记更改其他调用,您可能会在以后的维护期间遇到错误。get每当您复制代码时,这都是一个问题。使用局部变量可以最大限度地降低这种风险。
  • 并发情况下,如果 HashMap 被其他代码修改,理论上值可能会发生变化。您通常希望获得一次值并使用相同的值。虽然如果您遇到这种性质的问题,您可能应该首先查看其他解决方案(锁定、并发集合等)
于 2013-05-06T06:20:49.243 回答