Подтвердить что ты не робот

Разница между "HashSet" и "Set" в Scala?

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

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

Ответ 1

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

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

Set также является сопутствующим объектом * с методом apply **. Когда вы вызываете Set(...), вы вызываете этот метод factory и получаете возвращаемое значение, которое является своего рода Set. Это может быть HashSet, но может быть и другая реализация. Согласно 2, реализация по умолчанию для неизменяемого набора имеет специальное представление для пустого набора и устанавливает размер до 4. Неизменяемые наборы размером 5 и выше и mutable sets используют hashSet.


* В Scala вместо статических методов класса вы можете создать singleton object с тем же именем, что и ваш класс или признак. Это называется сопутствующим объектом, и методы, которые вы определяете на нем, можно назвать как ObjectName.method(), аналогично тому, как вы назовете статический метод в Java.

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