変化は分かる範囲で。
アイデアは、 O(1) (定数) を持たないコレクションの場合ですsize
。次に、sizeIs
特に小さな値(コメントの 1 など)との比較の場合に、より効率的になります。
しかし、なぜ?
すべてのサイズを計算してから比較を行うのではなく、比較sizeIs
を計算するときに早期に返すことができるオブジェクトを返すため、単純です。
たとえば、コードを確認してみましょう
def sizeCompare(otherSize: Int): Int = {
if (otherSize < 0) 1
else {
val known = knownSize
if (known >= 0) Integer.compare(known, otherSize)
else {
var i = 0
val it = iterator
while (it.hasNext) {
if (i == otherSize) return if (it.hasNext) 1 else 0 // HERE!!! - return as fast as possible.
it.next()
i += 1
}
i - otherSize
}
}
}
したがって、コメントの例では、非常に非常に長い3 つの要素のリストがあるとします。Listに少なくとも 1 つの要素と がsizeIs > 1
あることがわかるとすぐに戻ります。したがって、他の 2 つの要素をトラバースしてサイズ 3 を計算し、比較を行うコストを節約できます。hasMore
注意: コレクションのサイズが比較値よりも大きい場合、パフォーマンスはほぼ同じになります(size
各サイクルで余分な比較が行われるため、パフォーマンスが低下する可能性があります)。したがって、小さな値と比較する場合、または値がコレクションよりも小さくなると思われる場合にのみ、これをお勧めします。