https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html
大小特征值表示在遍历或拆分之前从estimateSize()返回的值表示一个有限的大小,在没有结构源修改的情况下,该大小表示一个完整遍历将遇到的元素数的精确计数。 表示由trySplit()产生的所有Spliterator都具有大小和子大小的特征值。
发布于 2017-06-02 15:45:35
Spliterator的一个典型示例是SIZED,而不是SUBSIZED,它是从HashMap创建的Spliterator。它将在其内部条目数组上维护一个范围,其中一些数组条目是null,因为其容量高于实际大小。要跳过的null条目的确切分布取决于包含的键的哈希代码。
因此,Spliterator最初确实知道它的(总)大小,但是当分割范围时,它不知道每个范围中有多少个元素。HashMap拥有的元素越多,大致平衡分裂的可能性就越高,因此这种策略是合理的,但确切的沉降情况还不清楚,需要对数组进行迭代才能找到答案。
在没有SUBSIZED的情况下报告SIZED特性是没有意义的,据我所理解,甚至是无效的。
发布于 2017-06-02 21:23:33
有点晚了,但还是..。不久前,我也对此感到困惑。我将列举我知道的问题:
HashMap (如上文所述),以及IdentityHashMap、LinkedHashMap和TreeMap。
这里需要注意的是,ConcurrentHashMap在列表中不存在,因为它允许并发更新,因此它的大小实际上是调用时的大小。事实上,CHM甚至没有明显地报告SIZED。
还有一些与Map相关的内容,比如HashSet和TreeSet,因为在内部这些仍然是地图。
在BitSet的面前,有一个是有点出乎意料的,BitSetSpliterator#characteristics看起来是这样的:
@Override
public int characteristics() {
// Only sized when root and not split
return (root ? Spliterator.SIZED : 0) |
Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.SORTED;
}这看起来可能很有趣,但其解释是:
// Raise the index of this spliterator to be the next set bit
// from the mid point
index = nextSetBit(mid, wordIndex(hi - 1));因此,对于BitSet来说,这种情况只发生一次,报告SUBSIZED是没有意义的,因为拆分不会完全发生在中间。
相反,完全没有意义:报告SUBSIZED,但不报告SIZED,因此没有人(据我在代码中所看到的)这样做。
https://stackoverflow.com/questions/44332358
复制相似问题