多次在另一个类中引用hashmap是否效率低下?

时间:2013-05-06 06:00:20

标签: java hashmap performance

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)之间的效率是否有任何差异,或者只是将其分配给变量并多次使用指定的变量。

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

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

4 个答案:

答案 0 :(得分:4)

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

我建议你做你认为更简单,更清晰的事情,除非你已经衡量了绩效差异。

答案 1 :(得分:2)

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

答案是肯定的。问题是它是否足够重要。明确的答案是通过分析来询问JVM。但是,您可以通过查看所选实现中的get方法进行猜测,并考虑是否要每次都执行所有操作。

请注意,还有另一个原因是您可能希望将值放在变量中,即您可以为其指定一个名称,从而使您的程序在将来更容易维护。

答案 2 :(得分:0)

这似乎是一种微观优化,在事物的方案中确实没有太大的区别。

正如@peter已经建议的那样,“优化”样式/可读性是选择第二个选项而不是第一个选项的更好理由。如果您真的进行了大量的通话,或者如果通话非常昂贵,那么优化速度只会开始有意义 - 在您当前的示例中可能都不是这样。

答案 3 :(得分:0)

将其置于局部变量中,原因有多种:

  • 会更快。读取局部变量肯定比HashMap查找便宜,可能是10-100倍。
  • 您可以为本地变量指定良好,有意义的名称
  • 您的代码可能更短/更简单,特别是如果您多次使用局部变量。
  • 如果有人修改了get个来电之一,但忘记更改其他电话,则可能会在以后的维护期间收到错误。每当您复制代码时,这都是一个问题。使用局部变量可以最大限度地降低这种风险。
  • 并发情况中,如果HashMap被其他一些代码修改,理论上该值可能会发生变化。您通常希望获得一次值并使用相同的值。虽然如果你遇到这种性质的问题,你应该首先考虑其他解决方案(锁定,并发集合等)。