Инициализация HashSet во время построения

Инициализация HashSet во время построения

1. обзор

В этом кратком руководстве мы познакомим вас с различными методамиinitializing the HashSet with values, at the time of its construction.

Если вместо этого вы хотите изучить возможностиHashSet, обратитесь кthis core article here.

Мы углубимся в Javabuilt-in methods since Java 5 and before, а затем добавим новыйmechanism introduced since Java 8. Мы также увидимcustom utility method и, наконец, рассмотрим функции, предоставляемые3rd party collection libraries, в частности Google Guava.

Если вам повезло, что вы уже перешли на JDK9 +, вы можете просто использоватьcollection factory methods.

2. Встроенные методы Java

Начнем с изучения трех встроенныхmechanisms available since the Java 5 or before.

2.1. Использование другого экземпляра коллекции

Мы можем передать существующийinstance of another collection для инициализацииSet. В приведенном ниже примере мы используем встроенныйList:

Set set = new HashSet<>(Arrays.asList("a", "b", "c"));

2.2. Использование анонимного класса

В еще одном подходе мы можем использовать анонимный класс для добавления элемента вHashSet.

Обратите внимание на использование двойных фигурных скобок. Это подходtechnically very expensive, поскольку он создает анонимный класс при каждом вызове.

Итак, в зависимости от того, как часто нам нужно инициализироватьSet, мы можемtry to avoid using this approach:

Set set = new HashSet(){{
    add("a");
    add("b");
    add("c");
}};

2.3. Использование метода коллекций начиная с Java 5

Класс JavaCollections utility предоставляет метод с именемsingleton для созданияSet с одним элементом. ЭкземплярSet, созданный с помощью методаsingleton immutable означает, что мы не можем добавлять к нему дополнительные значения.

Бывают ситуации, особенно при модульном тестировании, когда нам нужно создатьSet с одним значением:

Set set = Collections.singleton("a");

3. Определение метода пользовательских утилит

Мы можем определить методstatic final, как показано ниже. Методaccepts variable arguments.

ИспользованиеCollections.addAll, которое принимает объект коллекции и массив значений, составляетbest among others из-за низких накладных расходов на копирование значений.

method is using generics, поэтому мы можем передавать значения любого типа:

public static final  Set newHashSet(T... objs) {
    Set set = new HashSet();
    Collections.addAll(set, objs);
    return set;
}

Утилита метод может быть использован в нашем коде, как показано ниже.

Set set = newHashSet("a","b","c");

4. ИспользованиеStream начиная с Java 8

С появлением APIStream в Java 8 у нас появились дополнительные возможности. Мы можем использоватьStream with Collectors, как показано в коде ниже:

Set set = Stream.of("a", "b", "c")
  .collect(Collectors.toCollection(HashSet::new));

5. Использование библиотеки сторонних коллекций

Существует несколько библиотек сторонних коллекций, включая Google Guava, коллекции Apache Commons и коллекции Eclipse.

Эти библиотеки предоставляют удобные служебные методы для инициализации коллекций, такие как Set. ПосколькуGoogle Guava является одним из наиболее часто используемых здесь, у нас есть пример из него. В Guava есть удобные методы для изменяемых и неизменяемых объектовSet:

Set set = Sets.newHashSet("a", "b", "c");

Точно так же у Guava есть служебный класс для созданияimmutable Set instances, как мы видим в примере ниже.

Set set = ImmutableSet.of("a", "b", "c");

6. Заключение

В заключение мы рассмотрели несколько способов инициализацииHashSet в процессе его создания. Эти подходы никоим образом не обязательно охватывают все возможные пути. Это была просто попытка продемонстрировать наиболее распространенные способы.

Один из таких подходов, не описанных здесь, может заключаться в использовании построителя объектов для созданияSet.

Как всегда доступен рабочий пример кодаover on GitHub.