将hashmap和currenthashmap放一块进行比较,是因为二者的结构相差不多,只不过后者是线程安全的。

  首先说hashmap,在jdk1.8之前,hashmap的存储结构是数组+链表的形式,可以理解为元素为链表的数组,当添加一个kv对,首先计算key的哈希值,用哈希值对数组长度按位与,以此确定插入的位置,若该位置已有元素,则形成链表,同一链表元素的哈希值相同,当链表数组容量超过初始容量0.75时,将数组扩大一倍。

  由上可以看出,当数据量很大时,每一个位置的链表会变得很长,而链表的平均查找长度是n/2,查找耗时很大。

  因此jdk1.8后hashmap的存储结构更新为桶+链表/红黑树的形式,和之前相差不多,只不过在对链表长度的反应上做出了改变,当链表长度超过8,链表自动转化为红黑树的形式,当长度小于6,仍为链表,这是因为:红黑树的平均查找长度是log(n),当n=8,平均查找长度是3,链表平均查找长度是4,此时才有转换为红黑树的必要。而之所以采用红黑树,就是因为红黑树查找效率高(它是个二叉平衡树)。

  那为什么使用6和8作为链表和红黑树的分割?

  这是因为链表到红黑树的转化过程十分耗费资源,选择6和8,而不是7,就是为了避免频繁增删数据时,不断转换耗费大量资源。

最新文章

  1. 在win7环境下批量修改文件权限
  2. Linux 进程间通讯详解七
  3. Python进阶(三)--global和类属性
  4. Idea 常用快捷键列表
  5. Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断
  6. Docker 使用指南 (一)—— 基本操作
  7. yii2构造方法
  8. 【原】Spring与MongoDB集成:配置
  9. XHTML 结构化:使用 XHTML 重构网站
  10. logcat错误日志
  11. Access to the temp directory is denied. Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss
  12. VS2015智能提示由英文改为中文
  13. DDD实战进阶第一波(九):开发一般业务的大健康行业直销系统(实现经销商上下文仓储与领域逻辑)
  14. 深入理解css优先级
  15. 2019Java查漏补缺(一)
  16. python--文件流读写
  17. opensips redis配置记录
  18. Docker 容器备份例子
  19. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
  20. Spring MVC 学习笔记3 - 利用Default Annotation 模式获取请求,使Controller与View对应,并传值。

热门文章

  1. Azure 静态 web 应用集成 Azure 函数 API
  2. Golang中make的使用
  3. 自动化测试_移动端测试(二)—— Appium原理
  4. CSS z-index应用靠近用户的框
  5. 回溯算法 - n 皇后问题
  6. DNS域传输漏洞复现
  7. vue统计组件库和ui框架
  8. 深度分析:Java并发编程之线程池技术,看完面试这个再也不慌了!
  9. CentOS7.X 下安装MySQL8.0(附文件)
  10. LeetCode双周赛#33 题解