Map

Map(映射)

Map是一种把键对象和值对象映射的集合它的每个元素都包含一个键对象和值对象

  1. HashMap:基于散列表实现,插入<K,V>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能
  2. LinkedMap:类似于HashMap,但是迭代遍历时,取得<K,V>的顺序是其插入次序,或者是最近最少使用(LRU)的次序。
  3. TreeMap:基于 红黑树实现,查看<K,V>时,他们会被排序,TreeMap是唯一的带有subMap()方法的Map,可以返回一个子树。

HashMap底层原理

基于Hashing原理,将键值对传给put()方法,put调用hashCode()计算hashcode,找到bucket位置存储值对象,使用get()获取对象,通过建对象的equals()方法找到键值对,返回值对象。

HashMap使用链表解决碰撞问题,发生碰撞,对象将会存储在链表的下一个节点,HashMap将键值对对象存储在链表节点中,当两个不同的键对象的Hashcode相同,他们会存储在同一个bucket位置的链表中,键对象的equals()方法用来找到键值对。

使用HashMap还是TreeMap

TreeMap<K,V>的Key值是要求实现java.lang.Comparable,迭代的时候TreeMap默认是按照Key值升序排序,TreeMap的实现基于红黑树结构,适用于按照自然顺序或自定义顺序遍历键(线程安全)

HashMap<K,V>的Key值实现散列hashCode(),分布式散列的均匀的,不支持排序,数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素,(线程不安全)

需要排列的情况下使用TreeMap,HashMap性能更高但不支持排序

HashMap为什么线程不安全

jdk1.7中,在多线程环境下,扩容是会造成环形链或数据丢失

jdk1.8中,在多线程环境下会发生数据覆盖的情况

posted on 2020-05-14 18:11  Wang丶  阅读(144)  评论(0)    收藏  举报

导航