基于Hash表实现的一个Map结构(k-v键值对)
1、jdk1.2提供的,线程不安全的
2、初始化的数组长度是16,是2的幂次方
3、jdk8之后,如果链表的长度大于8,这个单向链表就会转换为红黑树
如果链表长度小于6位,就会从红黑树转换链表
4、数组扩容时,扩容的大小是原有数组长度的的2倍。
5、HashMap的键可以是null,但是只能有一个
1、jdk1.0提供的,线程安全的,
2、初始化的数组长度是11
3、Hashtable的键不能为空
4、数组扩容时,扩容的大小是原有数组长度的的2倍 + 1。
jdk1.5提供的包中的类
也是线程安全的,bucket(桶),对每一个桶加锁,也就是意味着
ConcurrentHashMap虽然是线程安全的,但是效率默认就是Hashtable 16倍
1、HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
2、HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
3、HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
4、Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
5、Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图
简单来说,ConcurrentHashMap 锁的是整个数组,而Hashtable锁的是每个桶
本文地址:https://blog.csdn.net/weixin_46479720/article/details/107642430
如对本文有疑问, 点击进行留言回复!!
浅谈Java如何实现一个基于LRU时间复杂度为O(1)的缓存
JDK1.6“新“特性Instrumentation之JavaAgent(推荐)
before社区电量是什么意思 Before社区电量获得方法
网友评论