数据结构之一

关于HaspMap 、 HashTable 、SpraseArray、  ArrayMap、ConcurrentHashMap

1.Map接口都知道,是键值对的数据结构,如题几种都是Map

基于hash快速查找的:HashMap HashTable ConcurrentHashMap

基于二分查找:SpraseArray  ArrayMap(这两货是android提出替代HashMap的,其实不是hash,hash在他们那只是个标记)

2.Map结构:

HashMap HashTable ConcurrentHashMap:数组-> Entry(包括key、value、hashcode、next)

SpraseArray  ArrayMap:两个数组,一个是hashcode,另一个是object,object的大小是hashcode的两倍(依次放key和value)

借用两张图 :

SpraseArray  ArrayMap的结构:

HashMap HashTable ConcurrentHashMap的结构:

3. HashTable 、ConcurrentHashMap

都是线程安全的,但是原理完全不一样,看源码就知道HashTable的操作函数全都加上了同步机制Synchronized,而ConcurrentHashMap则是使用分段锁技术,它的数组其实是Segment,而Segment实现了重入锁ReentrantLock,put、remove等操作使用分段锁,而size等全部锁住,是一种线程安全且高效的哈希表的解决方案,尤其其中的"分段锁"的方案,相比HashTable的全表锁在性能上的提升非常之大

4.数据存储

HashMap对象的key、value值均可为null

HahTable对象的key、value值均不可为null

冲突处理是外接链表法,如果hashcode值相同而且key值也相同,value值将会被覆盖

SpraseArray  ArrayMap如果key是重复的,value值将会被覆盖

5.关于性能

HashMap扩容,是2的幂次数,而且使用每个结点又为Entry类型,Entry存放了 key,value,以及下一结点的位置next,和hash值,当地址不够大时,HashMap会采用扩大当前空间两倍的方式去增大空间,而且在此过程中也需要不断的做hash运算,数据获取时也是通过遍历方式获取数据

SparseArray稀疏数组的方式去节省内存空间,由两个数组 分别存放key 和 values,并且 key的存放为int形式,减少了装箱操作,采取了压缩的方式来表示稀疏数组的数据,并且通过二分查找方式去装载和读取数据

HashMap是数据都是装箱的,接口就是这么定义的,而SparseArray不必装箱,提供SparseIntArray、SparseLongArray、SparseBooleanArray

猜你喜欢

转载自blog.csdn.net/jianpan_zouni/article/details/84630905