首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spliterator大小与子大小的标志

Spliterator大小与子大小的标志
EN

Stack Overflow用户
提问于 2017-06-02 15:21:01
回答 2查看 680关注 0票数 6

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

大小特征值表示在遍历或拆分之前从estimateSize()返回的值表示一个有限的大小,在没有结构源修改的情况下,该大小表示一个完整遍历将遇到的元素数的精确计数。 表示由trySplit()产生的所有Spliterator都具有大小和子大小的特征值。

  1. 是否有这样的情况:大小的标志是开着的,但是子大小的标志是关闭的?
  2. 是否有一种情况,当大小的标志是开着,但大小标志是关闭的?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-02 15:45:35

Spliterator的一个典型示例是SIZED,而不是SUBSIZED,它是从HashMap创建的Spliterator。它将在其内部条目数组上维护一个范围,其中一些数组条目是null,因为其容量高于实际大小。要跳过的null条目的确切分布取决于包含的键的哈希代码。

因此,Spliterator最初确实知道它的(总)大小,但是当分割范围时,它不知道每个范围中有多少个元素。HashMap拥有的元素越多,大致平衡分裂的可能性就越高,因此这种策略是合理的,但确切的沉降情况还不清楚,需要对数组进行迭代才能找到答案。

在没有SUBSIZED的情况下报告SIZED特性是没有意义的,据我所理解,甚至是无效的。

票数 11
EN

Stack Overflow用户

发布于 2017-06-02 21:23:33

有点晚了,但还是..。不久前,我也对此感到困惑。我将列举我知道的问题:

HashMap (如上文所述),以及IdentityHashMapLinkedHashMapTreeMap

这里需要注意的是,ConcurrentHashMap在列表中不存在,因为它允许并发更新,因此它的大小实际上是调用时的大小。事实上,CHM甚至没有明显地报告SIZED

还有一些与Map相关的内容,比如HashSetTreeSet,因为在内部这些仍然是地图。

在BitSet的面前,有一个是有点出乎意料的,BitSetSpliterator#characteristics看起来是这样的:

代码语言:javascript
复制
    @Override
    public int characteristics() {
        // Only sized when root and not split
        return (root ? Spliterator.SIZED : 0) |
            Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.SORTED;
    }

这看起来可能很有趣,但其解释是:

代码语言:javascript
复制
// 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,因此没有人(据我在代码中所看到的)这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44332358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档