一。JDK1.8以后改动

HashMap使用链表法避免哈希冲突(相同的hash值),当链表长度大于TREEIFY_THRESHOLD(默认为8)时,将链表转为红黑树,当小于UNTREEIFY_THRESHOLD(默认为6)时,又会转回链表以达到性能均衡。

二。什么时候扩容

进行PUT操作时,判断当前容器元素个数达到阈值(当前数组长度乘加载因子的值 )就自动扩容

扩容是重新计算容量,根据计算出容量定义一个新的容器,将原窗口元素放到新容器里。

三。HashMap为什么是线程不安全的

1.put的时候导致的多线程数据不一致。

比如有线程A和B,首先A要插入一个键值到HashMap中,首先要计算记录要插入的hash桶的索引坐标,然后取到该桶的链表头结点,此时线程A时间片用完。然后B开始执行,假设A计算出来的hash桶索引和B要插入计算出来的hash桶索引一关的话,那么B成功插入之后,A再次被调度执行时,它依然有过期的链表头,而且是不知道是过期的。这样就覆盖了线程B插入的记录,B插入的数据就会消失,这样就数据不一致了

2.resize而引起的死循环

当HashMap自动扩容时,当有2个线程同时检测到元素个灵长超过阀值(数组大小*负载因子),这时两个线程都会在put中调用resize();两个线程同时修改一个链表结构会产生一个循环链表,接下来再通过 GET()获取某一个元素就会出现死循环。

四。HashMap和HashTable的区别

双方都实现了Map接口,主要区别有:线程安全,同步,以及速度

1.HashMap是非synchronized的,并可以接受null(可以接受为null的链值),而HashTable则不允许null的键值。

2.HashTable是synchronized,意味着HashTable是线程安全的,多个线程可以共享一个HashTable;如果没有正确的同步,多个线程是不能共享HashMap的。ps:java5有一个ConcurrentHashMap.它可以替代HashTable,且扩展性更好

3.由于HashTable是线程安全的也是synchronized,所以在单线程下它比HashMap要慢,如果不需要同步且单线程那么使用HashMap性能要更好。

4.HashMap不能保证随着时间的推移MAP中的元素次序是不变的。

5.迭代器不同,HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。

五。术语介绍

1.sychronized意味着一次只能有一个线程能够更改HashTable。任何其它线程要更新时要先获取同步锁,其它线程要等 同步锁被释放才能再次获取同步锁更新HashTable.

六。HashMap可以通过下面语句进行同步

Map m = Collections.synchronizeMap(hashMap);

七。JDK1.7和JDK1.8里面HashMap的不同点

1.1.7中用的是头插法,1.8及之后用的是尾插法,原因:1.7是单链表进行的纵向延伸,头插法能提高插入效率,但是也会容易出现逆序环形链表死循环问题,1.8之后加入了红黑树使用尾插法,避免出现逆序环形链表死循环问题

2.扩容后数据存储位置的计算方式不一样

1)在1.7中直接用hash值和需要扩容的二进制数进行&(这就是为什么扩容的时候为啥一定是2的多少次幂的原因,因为2的N次幂的情况下最后一位二进制数才一定是1,能最大程序减少碰撞)

2)在1.8中,直接用的扩容 前的原始位置——扩容的大小值,而不是1.7的那种异域的方法,这种方式就相当只要判断hash值的新增与运算的位是0还是1,就直接迅速算出扩容 后的存储方式。

3.在1.7中使用的是数组+单链表的数据结构,但是在1.8及以后,用的是数组+链表+红黑树的数据结构(当链表的深度达到默认阀值(8)的时候,就会自动扩容把链表转成红黑树的数据结构把时间复杂度从0(N)变成0=O(logN)提高效率)

八。1.8及以后为什么不用二叉树而用红黑树

选择红黑树是为了解决二叉查找树的缺陷,二叉树在特殊情况下会变成一条线性结构,遍历查找会非常慢,而红黑树是平衡二叉树,插入数据后通过左旋右旋变色来保持平衡。引用红黑树是为了查找数据快,但也会有资源损耗,所以要长度大于8才会使用红黑树

基础之HashMap理解相关推荐

  1. java基础篇 - HashMap 理解Hash碰撞

    HashMap是大家都在用,面试的时候也经常会被考的考点,在这篇文章中说下HashMap的hash碰撞和减轻碰撞的优化. 1.什么是hash碰撞 在解释Hash碰撞之前先说一下hashmap的存储结构 ...

  2. Java基础-我所理解的泛型

    Java基础-我所理解的泛型 引用 [java]泛型中,? extends T 与 ? super T 的区别.看法_winrh的博客-CSDN博客_泛型 extends 前言 Java基础系列,我所 ...

  3. BlockChain:区块链技术基础概念综合理解——个人总结

    BlockChain:区块链技术基础概念综合理解--个人总结 目录 区块链的进阶与意义 1.区块链技术的进阶 2.区块链技术三大意义-传递价值.建立可信用环境.提高效率和降低成本 1.传递价值 2.建 ...

  4. 【Java基础】HashMap原理详解

    [Java基础]HashMap原理详解 HashMap的实现 1. 数组 2.线性链表 3.红黑树 3.1概述 3.2性质 4.HashMap扩容死锁 5. BATJ一线大厂技术栈 HashMap的实 ...

  5. java中 hashmap中小数,java基础知识--HashMap中对 h(length-1)的理解

    1.HashMap 数组下标计算方式: (h 是k的hashcode值:length是数组长度,HashMap数组默认长度是16) 2.&是什么意思? &在 java 中做与运算,&a ...

  6. java基础(十) 深入理解数组类型

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 1. 数组类简介   在java中,数组也是一种引用类型,即是一种类. ...

  7. 【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题

    导读:极大似然估计(MLE) 是统计机器学习中最基本的概念,但是能真正全面深入地理解它的性质和背后和其他基本理论的关系不是件容易的事情.极大似然估计和以下概念都有着紧密的联系:随机变量,无偏性质(un ...

  8. 【机器学习基础】深入理解Logistic Loss与回归树

    Logistic Function Logistic Function最常见的定义形式如下: 其中,,实际上这个公式起源于伯努利分布,代表概率,关于其起源在此暂不赘述. 公式有一个重要的性质,即: 并 ...

  9. java基础之 hashmap

    Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...

最新文章

  1. SpringCloud 2020版本教程3:使用sentinel作为熔断器
  2. DLL的编写与使用(C++)
  3. hdu1.3.2 Rank
  4. 数据库各个派系的起源和应用场景
  5. Django 学习笔记之七 实现分页
  6. 《刺客信条:英灵殿》全面分析:浅谈公式化开放世界
  7. centos7安装samba服务器
  8. 无缓冲channel与容量为1的channel的区别
  9. c++ fork 进程时 共享内存_尚学堂百战程序员:Python多进程与共享内存
  10. iOS - LocalNotification
  11. DEDE友情链接修改
  12. 火山安卓全屏侧滑布局器使用教程
  13. 智能优化算法——遗传算法原理(附代码)
  14. Unity 2D 打地鼠游戏制作过程总结
  15. 前缀、中缀、后缀(逆波兰)表达式以及逆波兰表达式实现简单计算器
  16. 短信服务器部署位置,搭建短信服务器
  17. AndroidIOS APP启动速度专项测试方法
  18. 计算机基本配置实验方案,实验4 计算机配置方案.doc
  19. R语言之使用C++开发R包
  20. 【算法设计与分析】分支限界法解决单源最短路径问题:输入带权图G=(V,E)以及出发顶点s,然后用分支限界法解决问题,要求输出路径和长度以及计算时间;

热门文章

  1. Python中单引号、双引号和三引号作用及区别
  2. 你的任务正常人每分钟心跳次数,一般为60~100次/分钟,若超出该范围则需要特别关注任务
  3. C#基础——值类型和引用类型
  4. javascript变量初始化位置
  5. 移动监控在安防行业的应用
  6. c++实现简单的数据结构(1.链表合并 2.士兵队列训练问题 3.Rails 4.Josephus Problem 5.Tree Recovery 6.四则运算 7.愚人节的礼物 8.Web)
  7. 使用JvisualVM无法连接linux远程服务器,错误无法使用service:jmx:rmi:// /jndi/rmi://ip:port/jmxrmi
  8. VirtualBox下Ubuntu上网设置,能够使用cuteftp传输资料
  9. 利用vue-awesome-picker模仿支付宝做的一个时间控件
  10. Linux操作系统中七件超厉害的武器