码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap

时间:2018-07-25 00:55:27      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:直接   情况下   链表   大小   键值对   情况   分布   效率   性能   

当往HashMap里面put元素的时候,首先会计算key的哈希值,根据哈希值得到当前元素的索引。存储时,如果当前key的哈希值已经存在,新的value会覆盖老的value。否则把当前key-value放入链表中。

HashMap中的数据结构是数组+链表的组合,以键值对(key-value)的形式存储元素,通过put()和get()方法存取对象。


性能问题
HashMap有两个参数影响其性能:初始容量和负载因子。均可以通过构造方法指定大小。

容量capacity是HashMap中bucket哈希桶(Entry的链表)的数量,初始容量只是HashMap在创建时的容量,最大设置初始容量是2^30,默认初始容量是16(必须为2的幂),解释一下,当数组长度为2的n次幂的时候,不同的key通过indexFor()方法算得的数组位置相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,get()的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。

负载因子loadFactor是HashMap在其容量自动增加之前可以达到多满的一种尺度,默认值是0.75。


线程安全
HashMap是线程不安全的,在多线程情况下直接使用HashMap会出现一些莫名其妙不可预知的问题。在多线程下使用HashMap,有几种方案:
A.在外部包装HashMap,实现同步机制。
B.使用Map m = Collections.synchronizedMap(new HashMap(...));实现同步(官方参考方案,但不建议使用,使用迭代器遍历的时候修改映射结构容易出错)。
D.使用java.util.HashTable,效率最低(几乎被淘汰了)。
E.使用java.util.concurrent.ConcurrentHashMap,相对安全,效率高(建议使用)。

 

HashMap

标签:直接   情况下   链表   大小   键值对   情况   分布   效率   性能   

原文地址:https://www.cnblogs.com/lc19149/p/9363491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!