java JDK源码解析
Hashmap
使用java语言进行系统开发时,使用得比较多得数据结构hashmap,它以[key,value],进行数据存储,通过key可以快速找到到对应的value值,但是key,value不能是java的基本类型 (int , float,double,long,short,byte) 必须是复合类型(String,Double...).并不是线程安全。
存储数据格式:默认16个桶,每个桶对应一个hash值,以数组形式对16个桶依次存储;对所有的key进行hash后,然后 hash&(桶的数量-1)得到对应的桶数组位置,然后把该[key,value]存储到该桶里面;查询时间:通过key查询时,首先通过key,hash后,找到对应的桶O(1),如果该桶下面只有一条数据,或者没有,查询时间最快O(1),否则遍历桶下面链表数据,直到找到对应的key,或者遍历完该桶下面所有的链。删除,添加只需要移动链表的指针,不需要移动内存数据,
当当前的数量超过阀值,需要重新申请一块内存(桶数组),是当前的内存(桶数组)的2倍,对已有的数据 也需要通过hash &(桶的数量-1)找到新桶的位置并存储。
Hashtable
在hashmap的基础上,加了多线程并发控制,在hashmap的方法上加了synchronized关键字。
Hashset
对hashmap进行了一层封装,由于该结构对外表现只存储key,默认value=new Object() ,对于hashmap 的key只会存在一份。
Linkhashmap
由于hashmap中数据是存放在不同的桶里面的,对hashmap进行数据遍历时,就不一定是添加数据的顺序,linkhashmap在此基础中,对每条存储数据增加两个指针,after指向下一条数据,befort指向,每次新加一条数据,就改变指针的指向,对map进行遍历时,就遍历该双向链表,就可以保证顺序。
currenthashmap
线程安全的hashmap,对hashmap进行了重写,hashmap使用数组链表来存储数据,currenthashmap在又在数组链表外又封装了一层,一个currenthashmap有多个分片,每个分片对应一个数组链表,对同一个分片的操作有多线程的并发控制,实际上就是,对每个分片的访问加了锁(可重入锁),和hashtable的并发控制相比,该结构对于多个线程访问不同的片段,不会互相等待,从而,降低了锁的粒度,提高了效率。
treemap
以树的形式来存储数据,每个节点包含指向父节点指针,指向左节点的指针,指向右节点的指针,左节点小与右节点。以该形式存储,插入和删除,都可以快速找到对应的位置,效率比较高。