繼續上一篇,這篇說mutable.Set
WHAT IT IS | WHAT IT DOES |
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也提供了+,++,-,--等方法,但是更有效的是+=,
+=,-=在可變和不可變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.