linkedSetOf 和 hashSetOf 有什么区别?

Ely*_*lye 2 collections kotlin

在 Kotlin 集合函数中,我们 有setOfmutableSetOfsortedSetOf和。linkedSetOfhashSetOf

前 3 个是了解它们的差异的。但最后两个是什么?他们与他人、与自己有何不同?

Mad*_*hat 6

您知道linkedSetOf返回 aLinkedHashSethashSetOf返回 a HashSetLinkedHashSet和之间的区别HashSet在于,LinkedHashSet维护元素插入集合或从集合中删除的顺序,而不HashSet维护元素的顺序。

观察下面的示例(Kotlin游乐场,如果你想看看它的实际效果)

val set: LinkedHashSet<Int> = linkedSetOf(1, 3, 2)

println(set) // [1, 3, 2]

set.remove(3)
set += listOf(5, 4)
println(set) // [1, 2, 5, 4]

val hashSet: HashSet<Int> = hashSetOf(1, 3, 2)

println(hashSet) // [1, 2, 3]

hashSet.remove(3)
hashSet += listOf(5, 4)
println(hashSet) // [1, 2, 4, 5]
Run Code Online (Sandbox Code Playgroud)

如果您查看在添加和删除元素的不同实例中如何打印集合,您会发现在 的情况下LinkedHashSet添加或删除元素的顺序保持不变,并在迭代时以相同的顺序打印。

注意:只是为了表明HashSet不对元素进行排序,下面是一个示例( Kotlin Playground

val linkedHashSet = linkedSetOf("aaa","bbb","ccc")

println(linkedHashSet) // [aaa, bbb, ccc]

linkedHashSet.remove("ccc")
linkedHashSet += listOf("ddd","zzz")
println(linkedHashSet) // [aaa, bbb, ddd, zzz]


val hashSet = hashSetOf("aaa","bbb","ccc")

println(hashSet) // [aaa, ccc, bbb]

hashSet.remove("ccc")
hashSet += listOf("ddd","zzz")
println(hashSet) // [aaa, bbb, zzz, ddd]
Run Code Online (Sandbox Code Playgroud)

  • @Eye“看起来‘HashSet’正在相应地对其进行排序”——‘HashSet’没有顺序。任何感知到的顺序都只是巧合,不能依赖。当您添加和/或删除元素时,顺序可能会完全改变。这与“LinkedHashSet”不同,其中顺序“始终”是插入顺序(即添加元素的顺序)。“SortedSet”具有由“Comparator”定义的顺序,并在添加和/或删除元素时维护该顺序。 (2认同)