Map(2)

五:Hashtable
Map的实现类Hashtable,用法和基本都和HashMap一样,就是这个Hashtable是线程安全的,不过现在也不怎么用了。
和Vector类似,Map体系也有一个自JDK1.2之前遗留的集合工具:Hashtable,它的操作接口和HashMap相同,和HashMap的区别在于:Hashtable是线程安全的,而HashMap是非线程安全的

六:ConcurrentHashMap

简单总结下 HashMap:无论是 1.7 还是 1.8 其实都能看出 JDK 没有对它做任何的同步操作,所以并发会出问题,甚至出现死循环导致系统不可用。

所以这时出来了ConcurrentHashMap:

因此 JDK 推出了专项专用的 ConcurrentHashMap ,该类位于 java.util.concurrent 包下,专门用于解决并发问题

①为什么有了Hashtable解决并发问题,但是后来又有了ConcurrentHashMap

ConcurrentHashMap融合了hashtable和hashmap二者的优势。

hashtable是做了同步的,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。

但是hashtable每次同步执行的时候都要锁住整个结构。看下图:

 

 

 图左侧清晰的标注出来,lock每次都要锁住整个结构。

ConcurrentHashMap正是为了解决这个问题而诞生的。

ConcurrentHashMap锁的方式是稍微细粒度的。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。

更令人惊讶的是ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些)。只有在求size等操作时才需要锁定整个表。

七:HashMap与Hashtable的区别

HashMap :jdk1.2版本,线程不安全,运行效率快;允许用null 作为key或是value
Hashtable:jdk1.0版本,线程安全,运行效率慢;不允许null作为key或是value 现在不怎么用
八:Hashtable与ConcurrentHashMap的区别
Hashtable的lock每次都要锁住整个结构。
ConcurrentHashMap锁住的是要操作的桶的结构。
九:TreeMap与TreeSet的关系,HashMap与HashSet的关系
TreeSet的底层就是TreeMap,用的是TreeMap中的key来保存的TreeSet的值。所以TreeSet就是TreeMap的结构:红黑树。
HashSet的底层就是HashMap,用的就是HashMap中的key来保存的HashSet的值。所以HashSet就是HashMap的结构:数组+链表/红黑树。
 

 

posted @ 2021-03-12 16:55  iLisa  阅读(77)  评论(0编辑  收藏  举报