一、Map集合
1.Map与Collection的区别
Map集合的特点:将键映射到值的对象,一个映射不能保护重复的键,每个键最多只能映射到一个值。
区别:
- Map集合存储元素是承兑出现的,Map的键是唯一的,值是可以重复的;
- Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。
要点:
- Map集合的数据结构针对键有效,跟值无关;
- Collection集合的数据结构针对元素有效。
2.Map的功能
二、HashMap
- 底层是散列表+红黑树,初始容量为16,装载因子为0.75,每次扩容2倍;
- 允许为null,存储无序;
- 非同步;
- 散列表容量大于64且链表大于8时,转成红黑树;
- key的哈希值会与该值的高16位做异或操作,进一步增加随机性;
- 当散列表的元素大于容量*装填因子时,会再散列,每次扩容2倍;
- 如果hashCode相同,key不同则替换元素,否则就是散列冲突;
三、LinkedHashMap
- 底层是散列表+红黑树+双向链表,父类是HashMap;
- 允许为null,插入有序;
- 非同步;
- 提供插入顺序和访问顺序两种,访问顺序是符合LRU算法的,一般用于扩展(默认是插入顺序);
- 迭代与初始容量无关(迭代的是维护的双向链表);
- 大多使用HashMap的API,只不过在内部重写了某些方法,维护了双向链表。
四、TreeMap
- 底层是红黑树,保证了时间复杂度为log(n);
- 可以对其进行排序,使用Comparator或者Comparable;
- 只要compare或者CompareTo认定该元素相等,那就相等;
- 非同步;
- 自然排序(手动排序),元素不能为null。
五、ConcurrentHashMap
- 底层是散列表+红黑树,支持高并发操作;
- key和value都不能为null;
- 线程是安全的,利用CAS算法和部分操作上锁实现;
- get方法是非阻塞,无锁的,重写node,通过volatile修饰next来实现每次获取都是最新设置的值;
- 在高并发环境下,统计数据(计算size等)其实是无意义的,因为在下一时刻size值就变化了。