有点晚了,但仍然......这也让我困惑了一段时间。我将列举我知道的那些:
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,所以没有人(据我在代码中查看)这样做。