sharpmap源码分析

HashMap的区别我们来看看ArrayMap的源码 description部分:正如第一句所说,ArrayMap是比HashMap内存优化更高效的键值 。ArrayMap维护一个数组来承载Map,稀疏数组,Arraymap,以及Java中HashMap的初始容量,这个问题可以追溯到HashMap的源码 。
【sharpmap源码分析】
1、jdk1.8的hashmap真的是大于8就转换成红黑树,小于6就变成链表吗本文夹杂了作者的部分个人观点 。如果描述有误,请指正我写这篇文章 , 因为我最近在学习hashmap 源码的时候,会结合网上的一些博客来促进理解 。至于红黑树和链表的相互转换,大部分文章都会这样描述:hashmap定义了两个常量:当链表元素个数大于8时,会转换成红黑树;当红黑树元素的个数小于6时 , 将被转换回链表 。通过仔细观察 , 笔者发现这种说法并不严谨 。

链表转换为红黑树的最终目的是为了解决map中元素过多,哈希冲突大,导致读写效率降低的问题 。在源码的putVal方法中 , 关于红黑树结构的分支是:如网上所说,当链表长度大于8时,将转换为红黑树 。我们来看看treeifyBin的方法:我们可以看到 , 在treeifyBin中,并不是简单的将链表转换成红黑树,而是判断表的长度是否大于64,如果小于64,就进行扩展 。

2、HashMap扩容因子为什么是0.75?通常情况下,加载因子需要在时间和空间开销之间找到一个折中点 。如果加载因子过高,比如1,减少了空间开销,提高了空间利用率,但也增加了查询时间开销 。如果装载因子太低,比如0.5,虽然可以降低查询时间开销,但是空间利用率很低,重散列操作次数增加 。在设置初始容量时,应该考虑映射中所需的条目数量及其加载因子,以便最大限度地减少重新散列操作的次数 。因此,在使用HashMap减少扩展操作时,一般建议根据估计值设置初始容量 。

3、HashMap为什么哪里不安全?这个案例有很多不安全的地方 。比如他的一系列问题会造成很大的伤害 。这些地方不安全 。虽然不是100%不安全 , 但是最好注意安全 。1.HashMap线程不安全的原因:原因:在JDK1.7中,由于多线程对HashMap的扩展,HashMap#transfer()被调用 。具体原因:一个线程执行过程中,被挂起,其他线程已经完成数据迁移 。CPU资源释放后,挂起的线程重新执行之前的逻辑,数据已经更改 , 导致无限循环和数据丢失 。

4、jdk1.8HashMap扩容原理解析最近看了面试题 , 谈到了hashmap的扩展,追根溯源,赶上了1.8版本中resize方法的核心改进 。一直没搞懂资料,但是苦思冥想终于想通了 。在这里做了笔记,分享给同样云里雾里的码友们 。时间有限,研究不全面 , 后期会更新 。在你解释源码之前 , 还是要做好铺垫 。

    推荐阅读