HashSet 看起来只是「没有值的 HashMap」,但 insert 的返回值、集合运算、保序去重、dedup 的陷阱和 Eq 与 Hash 的一致性都有细节。这篇每一点都用真实运行验证。
编译:成功
运行(退出码 0):
insert 3 -> true insert 5 -> true 再 insert 3 -> false len 2
remove 5 -> true remove 9 -> false contains 3 -> true
交 [3, 4] 并 [1, 2, 3, 4, 5] 差 a-b [1, 2] 对称差 [1, 2, 5]
is_subset true is_disjoint false
HashSet 相等与顺序无关: true
&a | &b = {1, 2, 3, 4, 5} &a & &b = {3, 4}HashMap 的细节见HashMap 的哈希与扩容。
编译:成功
运行(退出码 0):
保持首次出现顺序: [3, 1, 2, 5]
sort + dedup: [1, 2, 3, 5]
BTreeSet: [1, 2, 3, 5]
只 dedup(不排序): [3, 1, 3, 2, 1, 5, 2] ← dedup 只去掉相邻的重复 编译:成功
运行(退出码 0):
HashSet collect 11.30 ms (去重后 99995 个)
sort_unstable + dedup 11.66 ms (去重后 99995 个)
BTreeSet collect 15.18 ms (去重后 99995 个)耗时是本机 release 实测,键是 xorshift 生成的 0..100000 随机数;换成字符串或更多重复率,排名可能不同。
编译:成功
运行(退出码 0):
true
同 id 不同 name 再插入 -> false(被当作重复,保留的是 User { id: 1, name: "alice" })
replace 才会替换 -> 旧值 Some("alice"),现在是 "ALICE"
编译:成功
运行(退出码 0):
19
eq 恒为 true、哈希按内部值:20 个元素插入后 len,同一个程序运行 12 次: [20, 20, 20, 20, 19, 19, 17, 20, 20, 19, 19, 19] (理想的集合应当总是 1)