Java容器源码分析-HashMap vs TreeMap vs LinkedHashMap

        这里我采用的分析方式是帖子博客加上本身翻看jdk源码。有些状况下写一些测试的算法小例子加深印象。我这里只描述一下本身的总结想法     html

        上一篇文章咱们研究了set接口下的几个容器,因为其Set集合设计时底层的数据模型是Map,Set的实现是基于Map的、因此先搞懂Map、才能去理解Set、不然的话、直接去弄Set会以为云里雾里、最后发现是浪费时间。这一节介绍关于Map的相关接口、抽象类的功能。java

 1、Map集合结构体系图(网络图,侵删)算法

         这篇文章主要对TreeMap,HashMap和LinkedHashMap作分析,其余不经常使用的先不进行分析,另外针对HashTable和ConcurrentHashMap这两个线程安全的Map着重开一章去整理数组

2、源码分析 安全

       一、HashMap源码分析网络

            上帖子:http://www.cnblogs.com/chengxiao/p/6059914.html数据结构

            总结:源码分析

            (1)首先重点了解一下哈希表的数据结构,测试

                     哈希表(散列)主要利用数组和链表的方式。利用这种方式就能够避免单个数组出现的修改删除的高时间复杂度,又避免了聊表查询的高时间复杂度,具体实现方式请参看上边的博客,具体的讲解了目前的主要数据结构以及哈希表结构.net

            (2)知道了哈希表的数据结构,就能理解HashMap的存储方式了,HashMap就是利用数组+链表的方式进行数据存储。博客中也对主要的添加,删除,修改方法进行了源码详解。在看源码的过程当中注意细节

  • 方法没有加锁,因此对于hashMap来讲,是线程不安全的集合
  • 数组是如何扩容的,扩容的算法如博客  http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html
  • 对于hash碰撞是如何处理的,
    Hashmap里面的bucket出现了单链表的形式,散列表要解决的一个问题就是散列值的冲突问题,一般是两种方法:链表法和开放地址法。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是经过一个探测算法,当某个槽位已经被占据的状况下继续查找下一个可使用的槽位。java.util.HashMap采用的链表法的方式,链表是单向链表。
    hash碰撞的产生和解决:http://blog.csdn.net/luo_da/article/details/77507315
  • hash与hashCode的重写
    重写对象的equels必须重写hashCode方法,否则比对后没法识别是否是同一个对象
    hashCode重写例子:http://blog.csdn.net/woshixuye/article/details/8189398

   二、LinkedHashMap源码分析

         发布一个描述LinkedHashMap的博客:http://www.cnblogs.com/chenpi/p/5294077.html

  • LinkedHashMap继承了HashMap,在它的构造方法中调用的都是父类HashMap的构造方法
  • LinkedHashMap也采用数组加链表的方式,只不过LinkedHashMap在散列表基础上多维护了一个有序双向链表,因此LinkedHashMap支持排序。能够按照插入循序排序和访问数序排序
    源码分析:http://www.cnblogs.com/chenpi/p/5294077.html
  • LinkedHashMap一样没有同步方法,不支持线程安全
  • hash碰撞原理同于HashMap

   三、TreeMap源码分析

         发布一个描述TreeMap的博客:http://www.cnblogs.com/wzyxidian/p/5204879.html

  • TreeMap是采用一个“红黑树”的数据结构进行存储,存储对象对拥有它的父节点,左孩子,右孩子,具体的二叉树的实现原理请参考博客中有详解,这里不作过多解析
  • TreeMap是线程不安全的

 3、区别对比

      一、相同点

  • 都是线程不安全的
  • LinkedHashMap和HashMap都是采用散列表的结构进行数据存储

      二、不一样点

  • TreeMap存储方式采用链表的方式进行存储,而LinkedHashMap和HashMap采用散列表的结构存储
  • HashMap存储是无序的,LinkedHashMap能够按照插叙顺序排序,TreeMap按照key的天然排序或者自定义排序(只须要key定制排序Comparator )

4、总结

      三种类型分别在何时使用

  一、通常状况下,咱们用的最多的是HashMap。HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键能够直接获取它的值,具备很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
  二、TreeMap取出来的是排序后的键值对。但若是您要按天然顺序或自定义顺序遍历键,那么TreeMap会更好。
   三、LinkedHashMap 是HashMap的一个子类,若是须要输出的顺序和输入的相同,那么用LinkedHashMap能够实现,它还能够按读取顺序来排列,像链接池中能够应用。

相关文章
相关标签/搜索