JDK1.8 的HashMap为什么引入红黑树
JDK1.8之前HashMap的实现是数组+链表,很难达到元素百分百均匀分布。当HashMap中有大量元素存放在同一个桶中,这个桶下就有有一条特别长的链表,影响效率。
引入红黑树,使元素能够均匀分部,使效率更加平衡。
链表长度>=8(TREEIFY_LENGTH)并且容量>=64(MIN_TREEIFY_CAPACITY)时转换为红黑树。
怎么解决HashMap线程不安全的问题
- HashTable:是直接在操作方法上加了synchronized关键字,锁住整个数组,粒度比较大;
- SynchronizedMap:是使用Collections集合工具的内部类,通过传入Map封装出一个SynchronizedMap对象,内部定义了一个对象所,方法内通过对象锁实现;
- ConcurrentHashMap:使用分段锁(CAS + synchronized相结合),降低了锁粒度,大大提高并发度。
HashMap和HashTable的区别
- HashMap线程不安全,HashTable线程安全;
- HashMap的key和value可以是null,HashTable不可以;
- HashMap迭代器是fail-fast的,而HashTable的迭代器不是。当其