Ответ 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)
.