Spliterator - 大小与子范围标志

Sta*_*lfi 6 java java-8 java-stream spliterator

https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html

SIZED特征值表示在遍历或拆分之前从estimateSize()返回的值表示有限大小,在没有结构源修改的情况下,表示完整遍历将遇到的元素数量的精确计数.

SUBSIZED特征值表示由trySplit()生成的所有Spliterator都将是SIZED和SUBSIZED.

  1. 是否存在SIZED标志打开但SUBSIZED标志关闭的情况?
  2. 是否存在SUBSIZED标志打开但SIZED标志关闭的情况?

Hol*_*ger 11

的一个典型的例子SpliteratorSIZED,但不SUBSIZED,是Spliterator创建由HashMap.它将保持其内部条目数组的范围,其中一些数组条目是null,因为容量高于实际大小.null要跳过的条目的确切分布取决于包含的键的哈希码.

所以Spliterator最初确实知道它的(总)大小,但是当分割范围时,它不知道每个范围中有多少元素.拥有的元素越多HashMap,大致平衡分裂的可能性就越高,因此这种策略是合理的,但确切的子集是未知的,并且需要在数组上进行迭代才能找到.

报告一个SUBSIZED特征没有SIZED任何意义,据我所知,甚至没有效果.

  • `HashMap`总是保持它的大小,它是一个简单的`int`变量.所以它确实知道*有多少*`null`值; 它是容量(数组长度)和`size`之间的差异,但它不知道它们如何在数组上分布. (3认同)
  • @Holger如果它的'内部数组被拆分,我猜碰撞也会使子网大小未知,对吗?例如,第一个桶可以有3个条目,而其他桶有0个或1个.我理解正确吗? (2认同)