Разница между setOf и hashSetOf в Kotlin - PullRequest
1 голос
/ 07 января 2020

Какая разница между setOfStrings и hashSetOfStrings, полученными из следующего фрагмента кода?

val setOfStrings = setOf("A", "B", "C")
val hashSetOfStrings = hashSetOf("A", "B", "C") 

Всегда ли они имеют один и тот же тип? Та же производительность?

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Самым важным отличием между ними является изменчивость .

setOf() возвращает объект, который реализует интерфейс Set, но, вероятно, является неизменным (не реализует подинтерфейс MutableSet) ) и поэтому не могут быть изменены.

(онлайн документы указывают, что это read-only, что не обязательно обязательно означает неизменность. Но это самый безопасный предположить.)

Не указывает конкретный тип; Вероятно, это позволит изменить его в будущем, чтобы повысить производительность, использование памяти и / или подобное. Даже сейчас он может вернуть kotlin.collections.EmptySet, java.util.Collections.SingletonSet или kotlin.collections.LinkedHashSet; последний имеет более быструю (и предсказуемую) итерацию по сравнению со стандартным HashSet.

Так что setOf() предназначен для случаев, когда вам нужен эффективный неизменный набор, и вам не нужен точный тип.

hashSetOf(), с другой стороны, всегда возвращает kotlin.collections.HashSet (или подкласс), который всегда изменчив. Это для случаев, когда вам нужен этот конкретный тип.

И если вы хотите непостоянный набор, но не заботитесь о точном типе, вам лучше всего позвонить mutableSetOf().

(В общем, конечно, лучше не указывать конкретные типы, когда вам это не нужно; это делает ваш код гибким.)

2 голосов
/ 07 января 2020

Есть несколько отличий.

Во-первых, и самое главное, с setOf вы говорите Kotlin - «Я хочу сет, вы go выясните, какого рода, у меня нет предпочтений». Но с hashSetOf вы говорите Kotlin, что вы хотите HashSet.

Во-вторых, setOf создаст набор только для чтения, тогда как hashSetOf создаст HashSet, который реализует MutableSet, позволяя писать. (В конце концов, setOf дает вам LinkedHashSet, напечатанный как Set, поэтому он доступен только для чтения).

Что касается setOfStrings, это тип Set<String> (чтение только при поддержке LinkedHashSet), тогда как hashSetOfStrings - это HashSet<String> (чтение / запись, при поддержке HashSet).

Добавление типов в может сделать это более ясным:

val setOfStrings: Set<String> = setOf("A", "B", "C")
val hashSetOfStrings: HashSet<String> = hashSetOf("A", "B", "C")
0 голосов
/ 07 января 2020

setOf создает LinkedHashSet, а hashSetOf создает HashSet.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-linked-hash-set/index.html

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-hash-set/index.html

В оба конца - MutableSets, но setOf использует только чтение. Set

Разница заключается в итерации. Первый LinkedHashSet повторяется в том, как вы храните данные (что означает Linked), см. Также https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/set-of.html

HashSet хранит данные в соответствии с ha sh. Так что в этом случае итерация происходит более случайно. https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-hash-set/index.html

Так что, если порядок для итерации имеет значение, тогда выберите setOf или connectedSetOf, в противном случае вы также можете выбрать hashSetOf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...