Java 在另一个类中多次引用hashmap是否效率低下?
甲级Java 在另一个类中多次引用hashmap是否效率低下?,java,hashmap,performance,Java,Hashmap,Performance,甲级 理论上,JVM可以将差异优化到非常小的程度(与程序的其他部分相比)。但是,我更喜欢将其设置为局部变量,因为我相信这会使代码更清晰(因为我可以给它一个有意义的名称) 我建议您做您认为更简单、更清晰的事情,除非您已经测量了性能差异。理论上,JVM可以将差异优化到非常小的程度(与程序的其他部分相比)。但是,我更喜欢将其设置为局部变量,因为我相信这会使代码更清晰(因为我可以给它一个有意义的名称) 我建议你做你认为更简单、更清晰的事情,除非你已经测量了性能差异。这看起来像是一个微观优化,实际上对事情
理论上,JVM可以将差异优化到非常小的程度(与程序的其他部分相比)。但是,我更喜欢将其设置为局部变量,因为我相信这会使代码更清晰(因为我可以给它一个有意义的名称)
我建议您做您认为更简单、更清晰的事情,除非您已经测量了性能差异。理论上,JVM可以将差异优化到非常小的程度(与程序的其他部分相比)。但是,我更喜欢将其设置为局部变量,因为我相信这会使代码更清晰(因为我可以给它一个有意义的名称)
我建议你做你认为更简单、更清晰的事情,除非你已经测量了性能差异。这看起来像是一个微观优化,实际上对事情的安排没有多大影响
正如@peter已经提出的,在风格/可读性方面“优化”是选择第二个选项而不是第一个选项的更好理由。只有当你真的打了很多电话,或者电话很贵时,优化速度才有意义——在你当前的例子中,这两种情况可能都不是这样。这看起来像是一种微观优化,实际上对事情的安排没有多大影响
正如@peter已经提出的,在风格/可读性方面“优化”是选择第二个选项而不是第一个选项的更好理由。只有当你真的打了很多电话,或者电话费用很高时,优化速度才有意义——在你当前的例子中,这两种情况可能都不是这样。问题似乎是,你想知道多次调用get(l)而不是一次是否更昂贵 答案是肯定的。问题是这是否足够重要。最终的答案是通过分析询问JVM。但是,您可以通过查看所选实现中的GET方法来猜测,并且考虑是否每次都要完成这些工作。
请注意,您可能希望将值放入变量中还有另一个原因,即您可以给它一个明确的名称,使您的程序在将来更易于维护 问题似乎是,您想知道多次调用get(l)而不是一次是否更昂贵 答案是肯定的。问题是这是否足够重要。最终的答案是通过分析询问JVM。但是,您可以通过查看所选实现中的GET方法来猜测,并且考虑是否每次都要完成这些工作。
请注意,您可能希望将值放入变量中还有另一个原因,即您可以给它一个明确的名称,使您的程序在将来更易于维护 出于多种原因,将其放入局部变量中:
- 它将快得多。读取局部变量肯定比HashMap查找便宜,可能要便宜10-100倍
- 您可以为局部变量指定一个好的、有意义的名称
- 您的代码可能会更短/更简单,尤其是在多次使用局部变量的情况下
- 如果有人修改了一个
调用,但忘记更改其他调用,则在将来的维护过程中可能会出现错误。无论何时复制代码,这都是一个问题。使用局部变量可以最大限度地降低这种风险get
- 在并发情况下,如果HashMap被其他代码修改,理论上该值可能会改变。您通常希望获得一次值并使用相同的值。虽然如果您遇到这种性质的问题,您可能应该首先考虑其他解决方案(锁定、并发集合等)
- 它将快得多。读取局部变量肯定比HashMap查找便宜,可能要便宜10-100倍
- 您可以为局部变量指定一个好的、有意义的名称
- 您的代码可能会更短/更简单,尤其是在多次使用局部变量的情况下
- 如果有人修改了一个
调用,但忘记更改其他调用,则在将来的维护过程中可能会出现错误。无论何时复制代码,这都是一个问题。使用局部变量可以最大限度地降低这种风险get
- 在并发情况下,如果HashMap被其他代码修改,理论上该值可能会改变。您通常希望获得一次值并使用相同的值。虽然如果您遇到这种性质的问题,您可能应该首先考虑其他解决方案(锁定、并发集合等)
- 出于多种原因,将其放入局部变量中:
HashMap
的引用数量。如果只考虑效率,我将使用第一种方法。我相信第二种方法只会增加JVM中现有的HashMap
的引用数量。如果只考虑效率的话,我会选择第一种方法。谢谢,我想再次检查一下,因为从技术上讲,我正在编写一个股票交易程序,毫秒确实很重要。为了可读性,我通常使用局部变量来编写它,但我突然想到了这个问题,我想我可能会问一下。10分钟后我会接受的。你真的知道有任何JVM能够进行这种优化吗?我不认为,但很高兴被证明是错误的…@mikera我不知道有任何JVM会完全优化,但它可以优化到差异非常小的程度。i、 e.在这种情况下只有几分之一微秒。顺便说一句,如果您正在编写低延迟应用程序,您可以尝试TIntHashMap或FastMap
Class A {
public HashMap <Integer,Double> myHashMap;
public A(){
myHashMap = new HashMap()
}
}
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(){
theValue = anInstanceOfA.myHashMap.get(1);
//proceed to use theValue in my calculations. Is there a difference in efficiency?
}