繼續上一篇,這篇說mutable.Set
html
WHAT IT IS | WHAT IT DOESide |
Additions: | |
xs += x | xs增長x,返回xs |
xs += (x, y, z) | xs增長括號內元素,返回xs |
xs ++= ys | xs增長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 p | xs保留知足斷言p的那些元素 |
xs.clear() | 移除全部元素 |
Update: | |
xs(x) = b | (能夠寫成:xs.update(x,b)). b是true,增長x到xs,不然,從xs刪除x |
Cloning: | |
xs.clone | 返回一個新的Set,元素同xs |
如不可變的Set同樣,可變Set也提供了+,++,-,--等方法,可是更有效的是+=,
spa
+=,-=在可變和不可變Set,用法基本相同,那麼實際效果呢:
scala
不可變:代理
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
orm
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的內部元素)htm
略,講的是add特色,對比上表對象
可變Set默認實現使用的是哈希表存儲Set的元素; 不可變Set默認實現一個代理匹配到元素的數字。(書生:下面指immutable set)一個空的Set是一個單例對象,若是長度達到4,set做爲一個單獨的對象,他的全部元素會做爲他的字段。超過4,set被實現做爲 hash tries.接口
由上所得,對於小尺寸的Sets(4之內),不可變的set會更加的簡潔高效。若是你指望set的長度儘量小,選擇immutable.rem
Set有兩個子接口 SortedSet 和 BitSet.