Map与Collections

上一篇文章分享了个人对于list和set的看法,翻了一下部分底层,这次来分享一下map

map在我们的使用中非常频繁,因为它的用法很灵活,它的一些方法也可以省掉我们很多麻烦

这里补充一点上一次没说的东西,Collections,就像Objects一样,Collections是处理集合的工具类,常用的有这么几种:

Collections.shuffle(List<?> list)  //    打乱集合中元素顺序
Collections.sort(List<T> list)    //    将集合中元素按照默认规则排序(升序:小->大)
Collections.sort(List<T> list,Comparator<? super T>)        //    根据指定的比较器进行排序比较
Collections.addAll(List<T> list, elements1,elements2,elements3.....)    //    给指定的集合添加多个元素

当然,还有像CollecionUtils这种的工具类,都是很方便的~

正式开始这次的分享

首先是Map的特性:
 

1、Map是一个双列集合,每个元素包含两个值,一个key,一个value

2、Map的key不允许重复(会发生哈希冲突),value可以重复

3、Map的一个key只能对应一个vlaue

4、Map的key和value的数据类型可以使用相同的,也可以是不同的

5、Map的key和value可以为空

Map与Collections

Map常用的分类有HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap,一个一个来介绍~

1、HashMap,这个应该是本人用过最多的了,没有之一的那种,虽然线程不安全,但是单线程的时候效率最高

基于哈希表的一个Map接口的实现,是一个无序的集合
当链表中的元素超过了8个以后,会将链表转换为红黑树,元素少于6个会降低为链表

2、LinkedHashMap,截至目前为止没用过,线程不安全

基于哈希表和链表的实现,是一个有序的(这链表都上了,你别说不知道有序)

3、TreeMap,截至目前为止没用过,线程不安全

基于红黑树的实现,自带比较器,存储进去的key是有序的

4、ConcurrentHashMap,线程安全,做多线程的必备,并发度默认16

总结起来就这么几个字,分段锁,自旋锁
说简单点就是将元素进行分段,然后每段加锁,要对这个元素操作,就要获取这个锁,获取不到,就自旋

当然,有的人可能会想到,多线程的情况下不还有一个HashTable么

没错,HashTable也是一个线程安全的,但是性能上比ConcurrentHashMap差了太多,原因很简单,ConcurrentHashMap采用的是CAS机制,也就是所谓的乐观锁,而HashTable采用的是悲观锁的机制,所以明显ConcurrentHashMap比HashTable性能高很多

上一篇:集合框架工具Collections排序以及自定义比较器排序


下一篇:软件架构-分布式系列并发编程atomic&collections