当您需要在for循环中以相同的值多次调用HashMap
的{{1}}时,将其存储在变量中或使调用两次更有效还是三遍?
答案 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()