老生常谈…对于大佬们根本都不用看的博客!
对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!
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大体相同。