JDK1.8之前:数组挂接链表;
JDK1.8之后:数组挂接(链表 or 红黑树)。引入红黑树大程度优化了HashMap的性能,这主要体现在hash算法不均匀时,即产生的链表非常长,这时把链表转为红黑树可以将复杂度从O(N)降到O(lgN)
当负载大于0.75之后,数组扩容(增大一倍);当某个桶的链表过长之后(超过8),链表替换成红黑树;
1棵红黑树;有序;
HashTable: 线程安全;一把大锁,低效;
ConcurrentHashMap: 线程安全;分段锁,更高效;数组分成16个段,每个段1把独立的锁;读数据不需要上锁,写数据需要上该段的锁;
ConcurrentHashMap如何确保读操作和写操作不冲突:插入节点,在段头部插入;删除节点,通过复制被删节点之前的元素来实现;
本文详细介绍了Java中HashMap和TreeMap的区别与优化策略。HashMap在JDK1.8后引入红黑树,当链表过长时转换为红黑树以提高查找效率。负载因子超过0.75时,HashMap会进行扩容。而TreeMap则始终以红黑树形式保持有序。同时,对比了线程安全的HashTable和ConcurrentHashMap,后者采用分段锁设计,提供更高的并发性能。在并发环境下,ConcurrentHashMap通过特定插入和删除策略避免读写冲突。
465

被折叠的 条评论
为什么被折叠?



