上一篇文章分享了个人对于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常用的分类有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性能高很多