继续上一篇,这篇说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.