Closed HoeYeungHo closed 1 week ago
在
ConcurrentHashMap
1.8中,size()
方法和isEmpty()
方法都会调用sumCount()
方法,他们的时间复杂度均与Node
数组的大小有关。更合适的例子应用使用ConcurrentLinkedQueue
,其isEmpty()
方法的时间复杂度近似为O(1)
,而size()
方法的时间复杂度为o(n)
。在
ConcurrentLinkedQueue
中,isEmpty()
方法通过first()
方法进行判断,其中first()
方法返回的是队列中第一个值不为null
的节点
感谢指出,欢迎提交PR完善一下哈~
在
ConcurrentHashMap
1.8中,size()
方法和isEmpty()
方法都会调用sumCount()
方法,他们的时间复杂度均与Node
数组的大小有关。更合适的例子应用使用ConcurrentLinkedQueue
,其isEmpty()
方法的时间复杂度近似为O(1)
,而size()
方法的时间复杂度为o(n)
。在
ConcurrentLinkedQueue
中,isEmpty()
方法通过first()
方法进行判断,其中first()
方法返回的是队列中第一个值不为null
的节点由于在插入与删除元素时,都会执行
updateHead(h, p)
方法,所以该方法的执行的时间复杂度可以近似为O(1)
。而出现节点值为null
的原因是在迭代器中使用的逻辑删除而
size()
方法需要遍历整个链表,时间复杂度为$O(n)$此外,我认为可以说明
ConcurrentHashMap
是JDK 1.8中的,因为对于JDK 1.7,在ConcurrentHashMap
1.7中,将元素数量存储在每个Segment
中,size()
方法需要统计每个Segment
的数量,而isEmpty()
只需要找到第一个不为空的Segment
即可。