• hashmap和concurrentHashMap


    hashmap线程不安全的。

    hash表=数组+线性链表+>7红黑树

    数组是一段连续的存储单元数据,对于指定下标的查找,时间复杂度为o(1),对于一般的插入删除操作,涉及到元素的移动,平均复杂度为O(n),,,在hashmap中,数组的容量会被指定为最接近的2的指数次幂。。

    缺点:连续的,长度固定,当数组长度变化时,重新分配数组,相当于新的数组。

    hashmap 存储这个,在数组中存储时是key-value封装成一个对象,放进数组栈中。

    数组的方法,put get,都是根据下标进行的,但是map(key,value)没有规定数据类型。

    entry<k,v>[]  table  因为看底层源码,k,v没有规定数据类型,但是放进数组的,肯定有索引,所以要用特性的hashcode,将key换成索引类型,就是整型。类似取模,

    hash算法有hash碰撞,链表就出现了

    当有相同的hash值,要放进相同的数组,就将后插入的数据放在链表的前端,依次

    链表的新增,删除操作,只需要处理节点之间的引用,时间复杂度为o(1),但是对于查找就需要将链表的所有节点逐一进行对比,复杂度为o(n)

    红黑树:是一种近似平衡二叉搜索树,在每个结点上增加一个存储位表示节点的颜色,可以是red和black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树保证没有一条路径会比任何路径长出2倍,近似平衡

    查找、插入、删除等操作,其时间复杂度最大位o(logn<n)

    5个特性:

    1、每个结点要么是红的要么是黑的。

    2、根结点是黑色的。

    3、每个叶结点(树的尾端NIL指针或NULL节点)都是黑色de。

    4、一个结点红的,儿子必定是黑的。。参照下图

    5、对于任意结点,他到叶结点树尾端NIL指针的每条路径都包含相同数目的黑节点。

     本质是二叉查找树,这5条就保证了树的高度始终保持在h=logn。。

    叶结点,或者NULL结点,不包含数据,只充当树,在查询结束的指示。

    左旋-----是因为右边树太大,右平衡被打破,从右边树中挑选新的根节点,向左边移动,称之为左旋。

    虽然put delete 这些操作时,复杂为logn,频繁插入,会影响红黑树的平衡,频繁进行结点转换。也会有时间消耗。所以平时不会直接进行红黑树的存储。

    当链表的长度>   之后,才会真的转换成红黑树。

    hashmap中的数组会强制转换成最接近的》的2的指数次幂。

    hashmap允许放一个空值,当key为空,会put一个空的key,放在Entry<k,v> e=table[0];

    判断数组容量大小,0.75.如果没有超过就直接创建key-value就好,如果超过就要扩容,当前数组的2倍。

    1、其线程不安全,表现在高并发 ,hashmap(扩容死锁)-》CPU 100%

    2、数据会丢失

    扩容就是去开辟新的地方,new 新的数组,然后将旧数组上的数据,迁移到新数组上

    多线程下,去进行迁移。。。。都会去申请新的数组。开辟新的空间的浪费,内存溢出,或者内存不够。

    每个线程都会有自己的新数组,并且扩容之后去替换以前的数组。

    这就有可能导致A线程和B线程同时对一个数组扩容,A线程扩容后替换掉老数组,这时B线程使用的数组实际上是A线程扩容后的数组,就会产生线程安全问题。  

  • 相关阅读:
    属性,选择器和css
    笔记
    浏览器
    单位
    marquee 滚动标签
    双飞翼布局与圣杯布局
    随便看看吧
    光标的形状 颜色的表示方法
    如何实现浏览器title中的小图标
    解决浏览器兼容问题 补充
  • 原文地址:https://www.cnblogs.com/xiangyucc/p/13812883.html
Copyright © 2020-2023  润新知