所以我明白,hashmaps使用桶和hashcode和什么不是。根据我的经验,Java的hashcodes不是很小,而是通常数量很大,所以我认为它没有在内部建立索引。除非哈希码质量差,导致大致相等的桶长度和数量桶,那么什么使hashmaps比名称 - >值对列表更快?什么让hashmaps更快?
-1
A
回答
1
通过使用散列函数将元素映射到“桶”,散列图工作。当有人试图插入一个元素时,会计算一个哈希码,并对散列码应用一个模数运算,以便获取元素应该插入其中的存储区索引(这就是为什么它并不重要散列码有多大)。例如,如果您有4个存储桶并且您的散列代码为40,则它将被插入到存储桶0中,因为40模4是0.
当两个元素映射到同一个存储桶时,会发生“冲突”该元素存储在同一个桶下的列表中。
如果尝试获取元素,则使用散列函数再次映射密钥。如果存储区包含元素列表,则使用equals()函数来标识哪个元素是正确的(这就是为什么您必须实现equals()和hashcode()以将自定义对象插入到散列表中的原因)。
所以,如果你搜索一个元素,并且你的hashmap在桶上没有任何列表,你就有O(1)的成本。最糟糕的情况是,只有一个桶和一个包含所有元素的列表,其中获取元素与在列表O(N)上搜索相同。
2
我查看了Java的实现,发现它有点类似于模数,这对减少数组大小有很大的意义。这允许O(1)访问,使HashMaps更好。
相关问题
- 1. 什么让编程语言更快?
- 2. WebGL:什么更快?
- 3. 什么是更快,为什么?
- 4. 为什么VAR声明快不是让
- 5. 什么方法会让python算最快?
- 6. 有没有什么办法让一个UIWebView更快
- 7. 什么事情可以让css发展更快?
- 8. 为什么要添加$ this-> models。让它更快?
- 9. 让Haskell代码更快更快
- 10. 什么比innerHTML更快?
- 11. Mustache.js vs Mustache.net。什么更快?
- 12. 什么让shiro更灵活?
- 13. 让MediaPlayer反应更快?
- 14. 让Zend-Framework运行更快
- 15. 让ExecuteBatch执行更快
- 16. 如何让UNION ALL更快?
- 17. 让AVD工作更快
- 18. 如何让YUI更轻更快?
- 19. 回声为什么比打印更快?
- 20. 这段代码为什么更快?
- 21. 为什么\%(\)在Vim中比\(\)更快?
- 22. 为什么Neo4j比SQL更快
- 23. 为什么VertexBuffer比DynamicVertexBuffer更快
- 24. 哪一个更快,为什么? JavaScript的
- 25. 什么转换为str方法更快?
- 26. 为什么BLE 4.2比BLE更快4.1
- 27. 哪一个是更快,为什么
- 28. 为什么file_get_contents()比使用fsock_open()更快?
- 29. 为什么String.IsNullOrEmpty比String.Length更快?
- 30. 什么使翻新比HttpUrlConnection + AsyncTask更快?
散列表使用密钥的散列码直接访问存储条目的存储区。这是O(1)访问。如果由于相同或相似的散列码而在该存储桶中有多个元素,那么您可以进行更多的检查,但它的速度仍然快于遍历列表并搜索元素。 – dunni
另请参见:https://www.javacodegeeks.com/2014/03/how-hashmap-works-in-java.html – dunni
@dunni但是,如果哈希码是大数字,会浪费大量内存在索引中数组,它是如何O(1)? – JavaProphet