Map

  • 1. Map介绍
  • 2. HashMap
  • 2.1 介绍
  • 2.2 HashMap疑问解答
  • 3. LinkedHashMap
  • 4. TreeMap
  • 5. Hashtable:
  • 6. ConcurrentHashMap
  • 6.1 在 JDK7之前
  • 6.2 在 JDK8之后


1. Map介绍

Map 是最常用的集合类型之一,Map 是K V 形式的每一个键都对应一个值, 与Collection 无关;
Map 是一个接口 他的常用实现类有 HashMap、LinkedHashMap、TreeMap、 HashTable、 ConcurrentHashMap、WeakReferenceHashMap…等一些;

2. HashMap

2.1 介绍

HasMap: 是非线程安全的Map集合 , key与value 都可为null。JDK1.7底层是数组+单向链表 JDK1.7之后是 数组+单向链表+红黑树;
1.8HashMap 当链表节点较多时会转为红黑树;

2.2 HashMap疑问解答

1.为什么使用 数组+链表
数组查询快
链表增删快
Map 是一个链表集合 Node[]

2.JDK1.8以后为什么使用红黑树 又在什么时候进行转换的
为什么使用红黑树? 答: 当链表长度过长循环查询不是一种很好的方式,所以引入红黑树 这样当链表长度过长也能有效的减少循环的次数;

HashMap 中当链表长度>=8会进行 红黑树的装换

java 基本数据类型byte java 基本数据类型 map_链表


3. put() 方法原理

在调用put()方法的时候,首次put()会调用resize()方法初始化长度为16 Node数组。

然后会判断 这个hash所在的位置有没有值,没有会调用 newNode() 创建一个新的Node 放到数组中。

有值的话,判断进行equals() 判断 equals为false 会循环找到最后一个Node 然后 newNode() 方法获取一个新的 Node 然后赋值到查出来的最后Node中 next属性中

如果链表长度 (Node 节点) >= 8的时候 调用会调用resize()将链表 转换为TreeNode 红黑树

3. LinkedHashMap

LinkedHashMap 是HashMap的子类, 记录了key 的插入顺序 ;

4. TreeMap

TreeMap: key自动排序 默认使用自然排序升序排序的;

5. Hashtable:

Hashtable 底层是 数组+单向链表实现的 线程安全的 Hashtable的方法是synchronized的 所以效率是低于HashMap的;key与value 是不能为null的;

6. ConcurrentHashMap

6.1 在 JDK7之前

JDK7 之前 ConcurrentHashMap 底层采用了数组+Segment+分段锁的方式实现的, 是线程安全的; ConcurrentHashMap 是1.5提供的 它是Hashtable的替代 , 比Hashtable 的扩展性更好;ConcurrentHashMap 是使用了锁分段技术来保证线程安全的! Hashtable锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap 则是一次锁住一个桶;

6.2 在 JDK8之后

JDK1.8之后ConcurrentHashMap 采用了 数组+链表+红黑树的实现方式,内部使用了大量的CAS操作。

采用CAS 的机制 不在使用分段锁技术;

锁分段技术: 将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个数据被占用锁时其他段的数据也能被其他线程访问