9

Как инициализировать значения HashSet при создании?

9

Я столкнулся с проблемой: мне нужно создать объект типа Set с начальными значениями. Вот как я это делаю на данный момент:

Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");

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

5 ответ(ов)

11

В качестве сокращенной записи, которую я использую, но которая не очень эффективна по времени, я пишу это на одной строке:

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

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

При инициализации статических финальных множеств я обычно делаю это следующим образом:

public static final String[] SET_VALUES = new String[] { "a", "b" };
public static final Set<String> MY_SET = new HashSet<>(Arrays.asList(SET_VALUES));

Это немного менее громоздко, и эффективность имеет меньшую значимость для статической инициализации.

2

В Java 8 я бы использовал следующий код:

Set<String> set = Stream.of("a", "b").collect(Collectors.toSet());

Этот код создает изменяемый Set, предварительно инициализированный значениями "a" и "b". Обратите внимание, что хотя в JDK 8 этот метод возвращает HashSet, спецификация этого не гарантирует, и в будущем это может измениться. Если вам конкретно нужен HashSet, используйте следующий вариант:

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

Таким образом, вы получите именно HashSet.

0

Если у вас есть только одно значение и вы хотите получить неизменяемый набор, то достаточно использовать следующий код:

Set<String> immutableSet = Collections.singleton("a");

Этот метод создаёт набор, содержащий только одно указанное значение, и гарантирует, что добавление или удаление элементов будет невозможно, что делает набор неизменяемым.

0

Вы можете сделать это в Java 6:

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

Почему это полезно?

Использование Arrays.asList() для инициализации коллекции может улучшить читаемость кода в определённых ситуациях. Хотя явное добавление элементов может показаться понятнее, метод Arrays.asList() позволяет быстрее и компактнее создать набор элементов. Это особенно полезно, когда вам нужно инициализировать множество значений в одном месте, избегая необходимости писать много строк кода для добавления каждого элемента по отдельности.

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

0

Наиболее читаемым и простым вариантом будет использовать библиотеку Google Guava:

Set<String> stringSet = Sets.newHashSet("a", "b", "c");

Этот подход создаёт изменяемое множество.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь