有点晚了,但仍然......这也让我困惑了一段时间。我将列举我知道的那些:
HashMap
(如上所述),因此IdentityHashMap
,LinkedHashMap
和TreeMap
。
这里要注意的ConcurrentHashMap
是list 中不存在它,因为它允许并发更新,所以它的大小实际上是调用时的大小。事实上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
,所以没有人(据我在代码中查看)这样做。