将值存储在变量中还是调用HashMap函数?

时间:2018-09-21 22:13:30

标签: java performance hashmap

当您需要在for循环中以相同的值多次调用HashMap的{​​{1}}时,将其存储在变量中或使调用两次更有效还是三遍?

5 个答案:

答案 0 :(得分:1)

假设您的键具有HashMap的合理实现,则从hashCode()检索值是O(1)操作。

如果仅检索该对象几次,则可能是对其进行微优化(阅读:过早优化),将其存储在局部变量中,但是您可能不会注意到这两种方式的任何区别。将此类对象存储在局部变量中的真正原因是,避免重复用于检查映射中确实存在的键的样板代码,该值不是null,等等。

答案 1 :(得分:1)

在HashMap中访问数据是O(1),因此通常它相当快。但是,如果您从HashMap初始化具有适当值的变量,则速度会更快一些。如果您使用某些密钥访问HashMap,则首先调用该密钥的hashCode方法。如果您拨打一次-会更快。

我的经验表明,针对此类情况准备变量是更好的解决方案,这不仅是出于性能目的,而且还因为重构。如果发生这种情况,您必须更改一些代码,那么您在HashMap调用中进行了一次更改,而不是在不同的行中进行了很多更改,通常使一行保持不变(这会导致错误)。

答案 2 :(得分:0)

HashMap获取在恒定时间内运行。因此,从效率的角度来看,这并不重要。尽管将值存储在变量中更为简洁。

答案 3 :(得分:0)

调用hashmap.get()会创建一个间接寻址,因此它比直接变量引用要慢。 hashmap.get()具有O(1)复杂度这一事实与该问题的答案完全无关,因为O(1)复杂度仅意味着算法的执行复杂度不会随着元素数量的增加而增加,但是它并没有说明一次运行要执行多少个cpu周期,它只说明它是恒定的。 将结果存储在变量中可能是性能最高的。

答案 4 :(得分:-1)

我用ID LEVEL DATE set_ordinal grp_ordinal set-grp GROUP -- ----- ---------- ----------- ----------- ------- -------- 1 10 10/01/2000 1 1 0 1,10,0 1 10 11/20/2001 2 2 0 1,10,0 1 10 12/01/2001 3 3 0 1,10,0 1 30 02/15/2002 4 1 3 1,30,3 1 30 02/15/2002 5 2 3 1,30,3 1 20 05/17/2002 6 1 5 1,20,5 1 20 01/04/2003 7 2 5 1,20,5 1 30 07/20/2003 8 3 5 1,30,5 1 30 03/16/2004 9 4 5 1,30,5 1 30 04/15/2004 10 5 5 1,30,5 做了一个简单的测试,其中的键和值都是随机生成的64个字符的字符串。它在映射中使用1.000.000条记录,并在2个for循环中逐条进行:首先调用一次HashMap<String, String>,然后将其保存到变量中。其次是呼叫get() 3次。这是通过5次迭代完成的。

结果(以毫秒为单位):

get()

因此,对于此配置(字符串映射),一次调用 1 2 3 4 5 avg Store in a variable: 125 126 103 104 102 | 112 Call 3 times: 151 135 137 134 152 | 142 并将结果存储在变量中更有效


测试代码:

get()