*阿炮的Java笔记008号*-会持续更新的Map笔记

120 阅读2分钟

老生常谈…对于大佬们根本都不用看的博客!

对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!

Map集合

概念

  • 保存具有映射关系的数据:K-V结构;
  • key 和 value 可以是任何引用类型的数据;
  • key不允许重复,类必须重写equals() 和 hashCode() ;
  • 一对一的关系,通过指定一个key能够找到唯一的value;

Map的子孙类

HashMap的底层是 数组+链表+红黑树 (红黑树是JDK8增加的); LinkedHashMap的底层同上,增加了双向链表保证顺序; Hashtable的底层同HashMap; TreeMap的底层是红黑树结构;

HashMap

HashMap的概况

  • 允许使用 null 键和 null 值;
  • 不能保证存储的顺序;
  • key不允许重复;
  • value允许重复;

HashMap的底层

JDK7:数组+链表结构; JDK8:数组+链表+红黑树; 链表转红黑树的条件:①链表长度大于8;②数组长度大于64; 红黑树转链表的条件:链表的长度小于6;

为什么会有这种变化? HashMap采用链地址法,当发生冲突时会转化为链表,当链表过长会转化为红黑树提高效率。

HashMap的扩容

  • 加载因子决定了HashMap扩容的阈值,需要权衡时间与空间,一般情况下默认为0.75;
  • 每次扩展数组都是原来的2倍; 数据迁移的优化:
  • JDK7:遍历所有的节点依次通过hash函数计算新的下标,再插入到新数组的链表中;(会有多余的计算以及多线程情况下形成链表环)
  • JDK8:控制数组的长度始终为长2的整数次幂,key只会在在原来的位置,或者在原来位置+原数组长度。

LinkedHashMap

LinkedHashMap的概况

  • HashMap 的子类
  • 拥有双向链表来记录添加元素的顺序;

Hashtable

Hashtable的概况

  • 线程安全;
  • 实现原理和 HashMap 相同,功能相同;
  • 底层使用哈希表结构,查询速度快;
  • 不允许使用 null 作为 key 和 value;

TreeMap

TreeMap的概况

  • 底层使用红黑树;
  • 对key进行排序,与TreeSet大体相同。