Разница между «HashSet» и «Set» в Scala? - PullRequest
18 голосов
/ 11 августа 2011

Меня очень смущают типы HashSet и Set в Scala, поскольку оба они, похоже, делают одно и то же.

  • В чем разница между ними?
  • То же самое в Java?
  • В моей ссылке говорится, что HashSet является "классом явного набора" (по сравнению с Set). Что это значит?

1 Ответ

34 голосов
/ 11 августа 2011

Изменяемые и неизменяемые реализации Scala HashSet - это конкретные классы, которые вы можете создавать.Например, если вы явно запросите новый scala.collection.immutable.HashSet, вы всегда получите набор, который реализован с помощью хеш-функции.Существуют другие реализации набора, такие как ListSet, который использует список.

Set - это признак , который расширяется всеми реализациями набора (тогда как в Java Setинтерфейс).

Set также является сопутствующим объектом * с методом apply**.Когда вы вызываете Set(...), вы вызываете этот фабричный метод и получаете возвращаемое значение, которое является своего рода Set.Это может быть HashSet, но может быть и другая реализация.Согласно 2 , реализация по умолчанию для неизменяемого набора имеет специальное представление для пустого набора и устанавливает размер до 4. Неизменяемые наборы размером 5 и выше, а все изменяемые наборы используют hashSet.1021 ** В Scala вместо статических методов класса вы можете создать синглтон object с тем же именем, что и ваш класс или черта.Это называется сопутствующим объектом, и методы, которые вы определяете для него, могут называться ObjectName.method(), подобно тому, как вы вызываете статический метод в Java.

**Set(x) является синтаксическим сахаром для Set.apply(x).

...