2009-06-29 2 views
3
Set<Type> union = new HashSet<Type>(s1); 

ИКакая разница между этими двумя группами утверждений?

Set<Type> union = new HashSet<Type>(); 
Set<Type> s1 = new HashSet<Type>(); 
union.addAll(s1); 
+0

Извините, я отредактировал мой вопрос :) – Johanna

+0

PLZ добавить тег «коллекция» на этот вопрос ... –

+0

@Peter Kofler: Хорошее предложение! Добавлен тег 'collections'. – coobird

ответ

5

Предполагая, что Sets1 содержит то же содержимое в первом и втором примерах, конечные результаты должны совпадать.

(Тем не менее, второй пример не скомпилируется, поскольку Set представляет собой интерфейс, а не конкретный класс.)

Одним из преимуществ использования HashSet(Collection) конструктора в том, что она будет иметь начальную емкость, которая является достаточно, чтобы держать Collection (в данном случае, Sets1), который передается в конструктор:

Создает новый набор, содержащий элементы в указанной коллекции. HashMap создается по умолчанию коэффициент загрузки (0,75) и начальная емкость , достаточная для размещения элементов в указанном сборнике.

Однако, используя HashSet() конструктор, начальный размер равен 16, поэтому, если Set, который был добавлен с помощью Collection.addAll больше, чем 16, должно было бы быть изменение размера структуры данных:

Создает новый пустой набор; подложка HashMap экземпляр имеет значение по умолчанию начальная емкость (16) и коэффициент загрузки (0.75).

Поэтому, используя HashSet(Collection) конструктор для создания HashSet, вероятно, будет лучшим вариантом, с точки зрения производительности и эффективности.

Однако, с точки зрения читабельности кода, имя переменной union, кажется, подразумевает, что вновь созданный Set является объединением другого Set, поэтому, вероятно, один с использованием метода addAll будет более понятным кодом.

Если идея просто сделать новый Set из существующего, а затем вновь созданный Set, вероятно, следует назвать по-другому, например, как newSet, copyOfS1 или что-то об этом.

+0

Хорошо сказано. – jjnguy

1

Там нет никакой разницы. Оба создадут новый набор, содержащий все элементы в наборе s1.

Конечно, ваш второй пример кода не будет даже компиляции, так как вы не можете напрямую создать экземпляр интерфейса Set, но я предполагаю, что вы хотели сказать new HashSet вместо new Set.

7

первого будет более эффективным, потому что второй Set будет создан с правильным количеством пространства в структуре подложки данных, где во второй части коды, то Set придется изменить размер, чтобы освободить место для нового элементы.

Что касается конечных результатов, то они одинаковы.

1

Существует небольшая разница в том, что новый HashSet (s1) заранее удостоверится в том, что все элементы подойдут, и никакая перезагрузка не требуется.

Смежные вопросы