自定义Spliterator:getExactSizeIfKnown与estimateSize的实现选择
实现ArrayListSpliterator时,该重写哪个方法?
好问题!咱们把这个事儿掰扯明白:
首先得明确这俩方法的关系:getExactSizeIfKnown是一个默认方法,它的逻辑你已经贴出来了——先检查当前Spliterator有没有SIZED特征,有的话就调用estimateSize返回结果,没有就返回-1。
核心结论:优先重写estimateSize,不用特意重写getExactSizeIfKnown
对于ArrayListSpliterator这种明确知道精确元素数量的实现来说:
- 你只需要保证
estimateSize返回精确值就行(比如直接返回list.size() - currentPosition,具体看你的迭代位置),因为getExactSizeIfKnown的默认实现会自动帮你完成“特征检查+调用estimateSize”的逻辑,完全符合需求。 - 接口设计默认方法的初衷就是减少重复代码,你要是特意重写
getExactSizeIfKnown,反而属于重复造轮子,没必要。
关于“多一次方法调用的开销”
你担心的这个问题其实完全不用纠结:这种简单的默认方法调用,JVM会直接做内联优化,运行时几乎不会有额外开销,和你直接重写getExactSizeIfKnown返回精确值的性能几乎没差别。
额外补充:接口设计的意图
estimateSize是实现类提供大小信息的核心入口:对于有SIZED特征的Spliterator,它必须返回精确值;如果是近似大小(比如某些流式数据源),就返回近似值。getExactSizeIfKnown是给调用方用的便捷方法:让调用方不用自己先判断SIZED特征再调用estimateSize,直接就能拿到精确大小(如果有的话)。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

