每日一学--HashMap

HashMap

  • 内部结构:数组、链表、红黑树
  • 链树互转条件:长度超8转链转树,小6树转链
  • 初始化数组大小默认16,负载因子0.75
  • 扩容:原大小*2
  • hash函数
      static final int hash(object key) {
            int h;
            return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
      }
  • 原理:key的hashcode高低16位异或
  • 作用:
    1. 保留数据高低位特征,增加随机性,降低散列冲突
    2. 降低索引范围,方便与length-1用位运算&来计算数组下标(位运算&比取模%性能好)
  • 线程不安全,有覆盖可能:A线程判断节点为空时挂起,B线程写入节点;A恢复后写入节点,将B线程节点覆盖

线程安全的map

  • HashTable:操作方法加synchronized,锁住整个数组,粒度较大
  • ConcurrentHashMap:分段锁、CAS、volatile、synchronized,仅锁当前节点

有序的map

  • LinkedHashMap:单链表存储头尾节点;节点增加before和after属性标识前置和后置节点
  • TreeMap:红黑树实现,按key的自然顺序或定义的comprator排序
posted @ 2020-05-10 14:43  杨海星  阅读(102)  评论(0编辑  收藏  举报