PriorityBlockingQueue默认初始容量11为何remainingCapacity返回Integer.MAX_VALUE且添加元素后不变
问题原因解析
首先明确两个核心逻辑:
PriorityBlockingQueue是无界阻塞队列,默认初始容量11仅代表底层存储数组的初始化大小,并不是队列的最大容量上限。当存储的元素数量超过当前数组长度时,队列会自动触发数组扩容,只要JVM内存足够,理论上可以无限添加元素,不存在固定的容量上限。remainingCapacity()是BlockingQueue接口定义的方法,作用是返回队列可以无阻塞接收的剩余元素数量。对于无界队列而言,不存在固定的容量上限,因此JDK对该方法的实现直接固定返回Integer.MAX_VALUE,这是无界队列的标准实现约定。
为什么添加元素后返回值不变
你可以直接查看JDK中PriorityBlockingQueue的remainingCapacity()方法源码,实现逻辑就是写死返回固定值:
public int remainingCapacity() { return Integer.MAX_VALUE; }
这个方法完全没有计算当前队列元素数量、底层数组剩余空间的逻辑,所以不管你往队列里添加多少元素、底层数组有没有触发扩容,这个方法的返回值永远都是Integer.MAX_VALUE,不会发生变化。
补充说明:只有有界阻塞队列(比如
ArrayBlockingQueue)的remainingCapacity()方法才会实时计算剩余可用容量,所有无界队列的该方法都固定返回Integer.MAX_VALUE。
内容的提问来源于stack exchange,提问作者Kuldeep Shrivastava
相关产品推荐
相关产品推荐

