【scala初學】collections mutable.Set

    繼續上一篇,這篇說mutable.Set

WHAT IT IS

WHAT IT DOES

Additions:
xs += xxs增加x,返回xs
xs += (x, y, z)xs增加括號內元素,返回xs
xs ++= ysxs增加ys內所有元素,返回xs
xs add x增加x到xs,如果不重複,就返回true,重複,返回false
Removals:
xs -= x從xs刪除x ,返回xs
xs -= (x, y, z)從xs中刪除括號中的元素 返回xs
xs --= ys從xs中刪除ys中所有的元素 返回xs
xs remove x刪除x, 如果xs中包含x並正常刪除,返回true,否則false
xs retain pxs保留滿足斷言p的那些元素
xs.clear()移除所有元素
Update:
xs(x) = b(可以寫成:xs.update(x,b)). b是true,增加x到xs,否則,從xs刪除x
Cloning:
xs.clone返回一個新的Set,元素同xs


如不可變的Set一樣,可變Set也提供了+,++,-,--等方法,但是更有效的是+=,

+=,-=在可變和不可變Set,用法基本相同,那麼實際效果呢:

不可變:

scala> var s = Set(1, 2, 3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> s += 4
scala> s -= 2
scala> s
res2: scala.collection.immutable.Set[Int] = Set(1, 3, 4)

下面看一下可變的Set

scala> val s = collection.mutable.Set(1, 2, 3)
s: scala.collection.mutable.Set[Int] = Set(1, 2, 3)
scala> s += 4
res3: s.type = Set(1, 4, 2, 3)
scala> s -= 2
res4: s.type = Set(1, 4, 3)

   效果基本一樣,都是從Set(1,2,3)到Set(1,3,4),即便如此,他們內部行爲也不同。 可變的Set s+=4,是在Set的物理地址上改變了。s-=2亦如此。(書生:這裏我們仔細觀察一下,定義不可變的Set的,用的var s,每次s重新指向了新的Set。 而可變的Set的用val定義,物理地址一直未曾改變,真正變化的是Set的內部元素)


   略,講的是add特點,對比上表


   可變Set默認實現使用的是哈希表存儲Set的元素; 不可變Set默認實現一個代理匹配到元素的數字。(書生:下面指immutable set)一個空的Set是一個單例對象,如果長度達到4,set作爲一個單獨的對象,他的所有元素會作爲他的字段。超過4,set被實現作爲 hash tries.

      由上所得,對於小尺寸的Sets(4以內),不可變的set會更加的簡潔高效。如果你期望set的長度儘可能小,選擇immutable.


Set有兩個子接口 SortedSet 和 BitSet.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章