标签:直接 情况下 链表 大小 键值对 情况 分布 效率 性能
当往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,相对安全,效率高(建议使用)。
标签:直接 情况下 链表 大小 键值对 情况 分布 效率 性能
原文地址:https://www.cnblogs.com/lc19149/p/9363491.html