每日一学--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排序
原文地址:https://www.cnblogs.com/wod-Y/p/12863207.html