有點晚了,但仍然..前段時間也讓我感到困惑。我將列舉我所知道的那些:
HashMap
(如上所述),因此IdentityHashMap
,LinkedHashMap
和TreeMap
。
這裏要注意的是ConcurrentHashMap
是不在列表中,因爲它允許併發更新,所以它的大小實際上是調用時的大小。其實CHM
顯然還沒有報告SIZED
。
然後有那些涉及到Map
,如HashSet
和TreeSet
,因爲內部這些仍然地圖。
然後還有一個就是有點未預期在這裏面對位集合爲此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
,所以沒有人(就我看代碼中)那樣做。
在HashMap中,如果我不知道有多少值等於null,SIZED標記的大小如何? –
'HashMap'始終保持其大小,它是一個簡單的'int'變量。所以它確實知道*有多少* null值;它是容量(數組長度)和「大小」之間的差異,但它不知道它們是如何分佈在數組中的。 – Holger
@Holger如果它的'內部數組是分裂的,我猜碰撞也會使子尺寸未知,對吧?例如,第一個桶可以有3個條目,而其他桶有0個或1個。我理解正確嗎? –