Как инициализировать значения HashSet при создании?
Я столкнулся с проблемой: мне нужно создать объект типа Set
с начальными значениями. Вот как я это делаю на данный момент:
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
Есть ли способ сделать это в одну строку кода? Это было бы полезно, например, для финальных статических полей.
5 ответ(ов)
В качестве сокращенной записи, которую я использую, но которая не очень эффективна по времени, я пишу это на одной строке:
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));
Это немного менее громоздко, и эффективность имеет меньшую значимость для статической инициализации.
В 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
.
Если у вас есть только одно значение и вы хотите получить неизменяемый набор, то достаточно использовать следующий код:
Set<String> immutableSet = Collections.singleton("a");
Этот метод создаёт набор, содержащий только одно указанное значение, и гарантирует, что добавление или удаление элементов будет невозможно, что делает набор неизменяемым.
Вы можете сделать это в Java 6:
Set<String> h = new HashSet<String>(Arrays.asList("a", "b", "c"));
Почему это полезно?
Использование Arrays.asList()
для инициализации коллекции может улучшить читаемость кода в определённых ситуациях. Хотя явное добавление элементов может показаться понятнее, метод Arrays.asList()
позволяет быстрее и компактнее создать набор элементов. Это особенно полезно, когда вам нужно инициализировать множество значений в одном месте, избегая необходимости писать много строк кода для добавления каждого элемента по отдельности.
Тем не менее, выбор между этими подходами зависит от ваших предпочтений и конкретного контекста. Если вы считаете, что явное добавление элементов более читаемо, то вполне допустимо использовать этот метод. Каждый подход имеет свои плюсы и минусы, и важно выбирать тот, который лучше подходит вашей ситуации и команде.
Наиболее читаемым и простым вариантом будет использовать библиотеку Google Guava:
Set<String> stringSet = Sets.newHashSet("a", "b", "c");
Этот подход создаёт изменяемое множество.
Инициализация ArrayList в одну строчку
Как инициализировать статическую Map?
Как напрямую инициализировать HashMap (в литеральном виде)?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Имеют ли круглые скобки после имени типа значение при использовании new?