HashMap源码解读数据结构和. ArrayMap,SparseArray,TreeMap的区别

HashMap

      1HashMap构造方法参数:

           HashMap源码解读数据结构和. ArrayMap,SparseArray,TreeMap的区别

              initialCapacity为HashMap的初始容量默认为16。

              loadFactor为加载因子默认为0.75,加载因子越大对空间利用越多查找速度慢。

      1底层数据结构:在JDK 1.6和1.7采用 位桶+链表实现,同一个hash值的键值对会被放在同一个位桶里,当同一个位桶里元素较多时通过Key查找效率会比较低。而在JDK1.8采用了 位桶+链表+红黑树来实现当链表超过阀值(8)时,将链表转换为红黑树,降低了查找时间。

         HashMap是一个 列表散列:HashMap底层数据结构为一个数组,数组的没一项为一个链表。上面提到的initialCapacity初始容量就是数组的长度。

        如下图:

    HashMap源码解读数据结构和. ArrayMap,SparseArray,TreeMap的区别

       HashMap在创建时会创建一个Table数组。数组的元素为Entry节点。

     2Entry:entry为HashMap的内部类.通过他实现了数组的没一项链表结构

                    HashMap源码解读数据结构和. ArrayMap,SparseArray,TreeMap的区别

       3数据存储过程: 根据key计算出元素的hash值,根据hash值确定元素存储数组下标,如果该table下没有元素则直接存储 ,          如果table下有其它key的hash值想同的元素,先比较是否存在想同的key,如果存在想同的key,则覆盖key的原来的                      value。 如果不存在则放在链头。HashMap可存储的数据量为容量*加载因子,当数据量大于最大容量时会进行扩容,                  HashMap会以两倍的规律进行增大。需要消耗很大的内存和消耗内存。并且在遍历数组取数据时比较慢。所以我们可以使            用SparseArray和ArrayMap来替换HashMap

      4SparseArray:SparseArray的数据存储是通过两个数组来实现的,一个数组存储key一个数组存储value。SparseArray只           能存储 key为int类型数据,并且避免了对key的自动填箱(int转为Integer类型)。在存储和读取数据时使用二分查找法。             SparseArray中的元素都是按照key值从小到大排列的。所以在存储和去取数据时比HashMap效率高(数据量不大)。

         使用场景:

              1数据量不大

               2key为int类型(key不为int类型时。long类型有个LongArray)

 

       5ArrayMap:ArrayMap也是使用二分法存取数据,ArrayMap是一个<Key ,Value>映射的数据结构.一个数组记录的是key的           hash值另一个数组记录value。和SpraseArray一样在数据量大时也会影响性能。但是key类型没有限制。

       6TreeMap:TreeMap默认排序规则:按照key的字典顺序来排序(升序)。也可以通过实现Comparator接口来自定义排序             规则。