继续上一篇,这篇说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.
转载于:https://blog.51cto.com/yjplxq/1432363