自己看了很多篇文章,总结了一下
首先hashmap是线程不安全的,hashtable是线程安全的,为什么出现了currenthashmap呢,肯定是因为hashtable性能跟不上被,类似的还有vector和arrayList
jdk1.2的时候 有了hashmap 后来道格立java.util.concurrent包的创建者解决了线程不安全的这个问题
建议新手看一下源码 currenthashmap extends Abstractmap implements concurrentMap 并且序列化 然后设置了一个序列化的UID,这个大家可以看一下我前面的文章,序列化和反序列化https://www.cnblogs.com/luckbear/p/14696034.html
currenthashmap默认将hash表分为16个桶,也就是16个segment,然后对这些桶使用了锁分段技术,所谓锁分段技术就是一个进程对其中一个桶进行操作时,其他的进程可以对其他的桶进行操作,put get remove这些都对单个桶进行操作,当一个进程刚进入时就进行枷锁lock操作,这点就跟hashtable区分开,hashtable是对整张表进行操作,一次只能一个进程,而currenthashmap一次可以16个进程,并发效率显而易见。
但是有些方法,size或者containvalue就必须对整张表进行操作
hashmap初始大小是16,key 和value都可以是null,扩容时二倍长度+1,扩容因子百分之75,
讲几个名词
哈希冲突:key的哈希值按数组大小取模,这个值跟其他的相同时
负载因子:为了减少哈希冲突,当达到这个值的时候进行扩容
空间换时间:减小负载因子的值,加大初始容量,这样做查询边快,但是内存开销大
深入理解hashmap,hashtable,currenthashmap
原文:https://www.cnblogs.com/luckbear/p/14697409.html