HashMap:
JDK1.8之前:数组挂接链表;
JDK1.8之后:数组挂接(链表 or 红黑树)。引入红黑树大程度优化了HashMap的性能,这主要体现在hash算法不均匀时,即产生的链表非常长,这时把链表转为红黑树可以将复杂度从O(N)降到O(lgN)
当负载大于0.75之后,数组扩容(增大一倍);当某个桶的链表过长之后(超过8),链表替换成红黑树;
TreeMap:
1棵红黑树;有序;
synchronized VS. concurrent
HashTable: 线程安全;一把大锁,低效;
ConcurrentHashMap: 线程安全;分段锁,更高效;数组分成16个段,每个段1把独立的锁;读数据不需要上锁,写数据需要上该段的锁;
ConcurrentHashMap如何确保读 *** 作和写 *** 作不冲突:插入节点,在段头部插入;删除节点,通过复制被删节点之前的元素来实现;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)