Set<Type> union = new HashSet<Type>(s1);
ИКакая разница между этими двумя группами утверждений?
Set<Type> union = new HashSet<Type>();
Set<Type> s1 = new HashSet<Type>();
union.addAll(s1);
Set<Type> union = new HashSet<Type>(s1);
ИКакая разница между этими двумя группами утверждений?
Set<Type> union = new HashSet<Type>();
Set<Type> s1 = new HashSet<Type>();
union.addAll(s1);
Предполагая, что Set
s1
содержит то же содержимое в первом и втором примерах, конечные результаты должны совпадать.
(Тем не менее, второй пример не скомпилируется, поскольку Set
представляет собой интерфейс, а не конкретный класс.)
Одним из преимуществ использования HashSet(Collection)
конструктора в том, что она будет иметь начальную емкость, которая является достаточно, чтобы держать Collection
(в данном случае, Set
s1
), который передается в конструктор:
Создает новый набор, содержащий элементы в указанной коллекции.
HashMap
создается по умолчанию коэффициент загрузки (0,75) и начальная емкость , достаточная для размещения элементов в указанном сборнике.
Однако, используя HashSet()
конструктор, начальный размер равен 16, поэтому, если Set
, который был добавлен с помощью Collection.addAll
больше, чем 16, должно было бы быть изменение размера структуры данных:
Создает новый пустой набор; подложка
HashMap
экземпляр имеет значение по умолчанию начальная емкость (16) и коэффициент загрузки (0.75).
Поэтому, используя HashSet(Collection)
конструктор для создания HashSet
, вероятно, будет лучшим вариантом, с точки зрения производительности и эффективности.
Однако, с точки зрения читабельности кода, имя переменной union
, кажется, подразумевает, что вновь созданный Set
является объединением другого Set
, поэтому, вероятно, один с использованием метода addAll
будет более понятным кодом.
Если идея просто сделать новый Set
из существующего, а затем вновь созданный Set
, вероятно, следует назвать по-другому, например, как newSet
, copyOfS1
или что-то об этом.
Хорошо сказано. – jjnguy
Там нет никакой разницы. Оба создадут новый набор, содержащий все элементы в наборе s1.
Конечно, ваш второй пример кода не будет даже компиляции, так как вы не можете напрямую создать экземпляр интерфейса Set
, но я предполагаю, что вы хотели сказать new HashSet
вместо new Set
.
первого будет более эффективным, потому что второй Set
будет создан с правильным количеством пространства в структуре подложки данных, где во второй части коды, то Set
придется изменить размер, чтобы освободить место для нового элементы.
Что касается конечных результатов, то они одинаковы.
Существует небольшая разница в том, что новый HashSet (s1) заранее удостоверится в том, что все элементы подойдут, и никакая перезагрузка не требуется.
Извините, я отредактировал мой вопрос :) – Johanna
PLZ добавить тег «коллекция» на этот вопрос ... –
@Peter Kofler: Хорошее предложение! Добавлен тег 'collections'. – coobird