hashmap的扩容机制

hashmap的扩容机制,第1张

hashMap 扩容机制就是重新计算容量,向 hashMap 不停地添加元素,当 hashMap 无法装载新的元素,对象将需要扩大数组容量,以便装入更多的元素。

HashMap 的扩展原理是 HashMap 用一个新的数组替换原来的数组。重新计算原数组的所有数据并插入一个新数组,然后指向新数组。如果阵列在容量扩展前已达到最大值,阈值将直接设置为最大整数返回。

HashMap 容量扩展的特性:加载因子越大,空间利用率越高,扩容前需要填充的元素越多,put *** 作越快,但链表容易过长,hash 碰撞概率大,get *** 作慢。加载因子越小,get *** 作越快,链表越短,hash 碰撞概率低。但是,空间利用率低。put 元素太多会导致频繁扩容,影响性能。

HashMap 扩容可以分为三种情况:

1、使用默认构造方法初始化 HashMap。从前文可以知道 HashMap 在一开始初始化的时候会返回一个空的 table,并且 thershold 为 0。

因此第一次扩容的容量为默认值 DEFAULT_INITIAL_CAPACITY 也就是 16。同时 threshold = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR = 12。

2、指定初始容量的构造方法初始化HashMap。那么从下面源码可以看到初始容量会等于 threshold,接着 threshold = 当前的容量(threshold)* DEFAULT_LOAD_FACTOR。

3、HashMap 不是第一次扩容。如果 HashMap 已经扩容过的话,那么每次 table 的容量以及 threshold 量为原有的两倍。

以上内容参考:百度百科-Hashmap

Hashmap本身做这个功能没有听说过,具体有没有也不清楚,但是我这里可以给你提供一种方案: (1)使用LinkedHashMap来记录数据,这种map是可以记录key的先后顺序的。 (2)在每次向这个map put数据时:A)检测一下map的大小,

和HashMap方法一样,也是用put添加元素,LinkedHashMap也是java.util.Map的实现类

区别在于

Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null允许多条记录的值为 NullHashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11939166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存