ビュートップ性能特性等価性目次

等価性

コレクションライブラリは等価性とハッシュ値の計算について統一的な手法を採っています。 考え方としては、まずコレクションを集合・マップ・列に分けます。異なるカテゴリのコレクションは常に非等値です。 例えばSet(1, 2, 3)List(1, 2, 3)と同じ要素を持っていますが、等値ではありません。 一方で、同じカテゴリの中では、コレクションは等しい要素を(列では等しい要素を等しい順序で)含むときに、かつその時に限り等値です。 例えばList(1, 2, 3) == Vector(1, 2, 3)であり、またHashSet(1, 2) == TreeSet(2, 1)です。

等値性の判定において、コレクションが可変であるか不変であるかは関係ありません。 可変なコレクションについては、単に等値性の判定が実行された時点での要素を考慮します。 この結果可変なコレクションは、追加や削除された要素に依存して、異なる時点においては異なるコレクションと等値になります。 これは可変なコレクションをハッシュマップのキーとして使う場合の落し穴になるかもしれません。 例:

scala> import collection.mutable.{HashMapArrayBuffer}
import collection.mutable.{HashMap, ArrayBuffer}
scala> val buf = ArrayBuffer(123)
buf: scala.collection.mutable.ArrayBuffer[Int] = 
ArrayBuffer(1, 2, 3)
scala> val map = HashMap(buf -> 3)
map: scala.collection.mutable.HashMap[scala.collection.
mutable.ArrayBuffer[Int],Int] = Map((ArrayBuffer(1, 2, 3),3))
scala> map(buf)
res13: Int = 3
scala> buf(0) += 1
scala> map(buf)
java.util.NoSuchElementException: key not found: 
ArrayBuffer(2, 2, 3) 

この例では、配列xsのハッシュコードが最後から2行目で変化するので、最後の行での選択はおそらく失敗するでしょう。 よって、ハッシュコードによる参照はxsが保存されたときとは異なる場所を探します。

続いては: ビュー


ビュートップ性能特性等価性目次