zoukankan      html  css  js  c++  java
  • HashMap的实现原理?如何保证HashMap线程安全?

    A:HashMap简单说就是它根据建的hashcode值存储数据的,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历的顺序是不确定的。

    B:HashMap基于哈希表,底层结构由数组来实现,添加到集合中的元素以“key--value”形式保存到数组中,在数组中key--value被包装成一个实体来处理-也就是上面Map接口中的Entry

    C:在HashMap中,Entry[]保存了集合中所有的键值对,当我们需要快速存储、获取、删除集合中的元素时,HashMap会根据hash算法来获得“键值对”,在数组中存在的位置,来实现对应的操作方法。

    D:HashMap底层采用了数组来维护的,Entry静态内部类的数组

    E:HashMap添加元素:将准备增加到的Map中的对象与该位置上的对象进行比较(equals方法),如果相同那么就将该位置上的那个对象(Entry类型)

    的value值替换掉,否则沿着该Entry的链继续重复上述过程,如果到链的最后仍然没有找到与此对象相同的对象,那么这个时候就会被增加到数组中,

    将数组中该位置上的那个Entry对象链到该对象的后面(先hashcode计算位置,如果找到 相同位置便替换值,找不到则重复hashcode计算,直到最后添加到hashmap最后面)

    F:HashMap是基于哈希表的Map接口的非同步实现,允许null键值,但不保证映射的顺序;底层使用数组实现,数组中的每项是一个链表;存储时根据key的hash算法来决定其存储位置;数组扩容需要重新计算扩容后每个元素在数组中的位置很耗性能

    G:ConcurrentHashMap是HashMap线程安全的实现,允许多个修改操作同时进行(使用了锁分离技术),它使用了多个锁来控制对hash表的不同段进行修改,每个段其实就是一个小的hashtable,它们有自己的锁。使用了多个hash表(段Segment),允许多个读操作并发进行,读操作并不需要锁,因为它的HashEntry几乎是不可变的。

    H:HashmapJDK1.7之前是数组加链表;JDK1.8之后 融入了红黑数,如果链表超过8的话 就直接扔树里,它不是个线程安全的 并发下会出现死锁问题,也就是链表出现相互引用

    I:JDK1.8 融入了红黑数,hash会产生哈希冲突 链表会越来越长 找一个数据需要查找 链表需要遍历 查找速度太慢,而且数组的话 会扩容 扩容一次 数据之间会进行深拷贝 hash值又得重新计算

    古今成大事者,不唯有超世之才,必有坚韧不拔之志!
  • 相关阅读:
    关于数据库 长度和小数点的关系和坑
    温故而知新,jquery选择器$=
    局域网访问本地localhost页面
    解决谷歌浏览器和360浏览器 input 自动填充淡黄色背景色的问题
    抢月饼 浏览器插件开发
    css 多行溢出
    ss服务待研究
    NUnit笔记
    5分钟实现VS2010整合NUnit进行单元测试
    vs2010中使用Nunit测试c#代码结果的正确性
  • 原文地址:https://www.cnblogs.com/songwp/p/14863181.html
Copyright © 2011-2022 走看看