Какова точная разница между этими двумя группами утверждений? - PullRequest
3 голосов
/ 29 июня 2009
Set<Type> union = new HashSet<Type>(s1);

И

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

Ответы [ 4 ]

7 голосов
/ 29 июня 2009

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

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

5 голосов
/ 29 июня 2009

Если предположить, что 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 или что-то в этом роде.

1 голос
/ 29 июня 2009

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

1 голос
/ 29 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...