Map

Map:是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,键对象不允许重复(可存在一个null),而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样。
Map 接口主要有两个实现类:HashMap 类和 TreeMap 类。其中,HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。还有HashTable

 

HashMap:

HashMap底层数据结构为数组+链表+红黑树,主要数据存储对象为Node<k, V>[] table(jdk1.7使用的Entry), 关键方法put();

扩容机制:如果某个桶中的链表长度大于等于8了,则会判断当前的hashmap的容量是否大于64,如果小于64,则会进行扩容;如果大于64,则将链表转为红黑树。

  1. 先⽣成新数组

  2. 遍历⽼数组中的每个位置上的链表或红⿊树

  3. 如果是链表,则直接将链表中的每个元素重新计算下标,并添加到新数组中去

  4. 如果是红⿊树,则先遍历红⿊树,先计算出红⿊树中每个元素对应在新数组中的下标位置

    a. 统计每个下标位置的元素个数

    b. 如果该位置下的元素个数超过了6,则⽣成⼀个新的红⿊树,并将根节点的添加到新数组的对应位置

    c. 如果该位置下的元素个数没有超过6,那么则⽣成⼀个链表,并将链表的头节点添加到新数组的对应位置

  5. 所有元素转移完了之后,将新数组赋值给HashMap对象的table属性

 

HashTable: 底层数据结构为数组+链表,与HashMap相似,但其是线程安全的,因为其public方法上都增有synchronized。

 

TreeMap:

TreeMap底层数据结构为Entry(双向链表),存储数据时通过comparator比较器进行比较,找到其put的对象的key所在的位置。所生成的map是有序的。

 

posted @ 2022-05-09 15:24  昵称已被使用!!!  阅读(98)  评论(0编辑  收藏  举报