Статьи

HashSet в Java

Вступление:

HashSet в Java реализует интерфейс Set, т.е. не допускает дублирования. Он внутренне поддерживается HashMap, который работает по принципу хеширования.

Мы можем хранить нулевое значение в HashSet . Его емкость по умолчанию составляет 16 с коэффициентом загрузки 0,75, где:

1
Load factor = Number of Stored Elements / capacity

Java HashSet не синхронизирован. Кроме того, нет гарантии сохранения порядка вставки элементов.

В этом уроке мы узнаем, как работать с Java HashSet .

Создание HashSet :

Мы можем создать Java HashSet, используя один из следующих конструкторов:

1
2
3
4
HashSet() // default capacity of 16 with a load factor of 0.75
HashSet(int initialCapacity)
HashSet(int initialCapacity, float loadFactor)
HashSet(Collection c)

Каждый из этих конструкторов довольно интуитивно понятен.

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

1
Set<Integer> set = new HashSet<>();

Обычно используемые методы:

Давайте теперь посмотрим на некоторые методы, которые могут помочь нам манипулировать с помощью Java HashSet:

1. логическое сложение (E e):

Он просто добавляет элемент к данному набору, если его еще нет. Если элемент уже присутствует, add () просто возвращает false:

1
2
3
4
5
6
7
System.out.println(set.add(1));  //true
System.out.println(set.add(2));  //true
System.out.println(set.add(3));  //true
System.out.println(set.add(1));  //false - as already present
  
//Note that the order of elements isn't guaranteed
System.out.println(set); //[1, 2, 3]

2. логическое значение содержит (Object obj):

Метод contains () возвращает true, если элемент существует в указанном наборе, в противном случае – false :

1
2
System.out.println(set.contains(1)); //true
System.out.println(set.contains(4)); //false

3. логическое удаление (Object obj):

Как следует из названия, он удаляет элемент obj, если он существует, и возвращает true . Если такого элемента не существует, он просто возвращает false :

1
2
System.out.println(set.remove(1)); //true
System.out.println(set.remove(4)); //false

Обратите внимание, что HashSet также наследует методы removeAll () и removeIf () , которые можно использовать для удаления значений.

4. логическое значение isEmpty ():

Возвращает true для пустого набора, иначе false :

1
System.out.println(set.isEmpty()); // false

5. int size ():

Он просто возвращает количество элементов, присутствующих в данном наборе.

6. void clear ():

Метод clear () удаляет все значения, присутствующие в указанном наборе, что делает его пустым.

Внутренняя реализация:

HashSet внутренне использует HashMap для хранения своих элементов. Элементы, хранящиеся в HashSet, отображаются как ключи в HashMap . Поля значений всех этих записей содержат константу PRESENT:

1
private static final Object PRESENT = new Object();

который является фиктивным объектом.

Итерация по HashSet :

Мы можем использовать один из следующих способов для перебора элементов в HashSet :

1. forEach () :

Начиная с Java 8, мы можем использовать forEach () для перебора любой коллекции Java :

1
set.forEach(e -> System.out.println(e));

2. forEachRemaining ():

Java 8 также поддерживает конструкцию forEachRemaining (), которая будет использоваться с любым итератором в коллекции :

1
2
3
Iterator<Integer> itr = set.iterator();
  
itr.forEachRemaining(e -> System.out.println(e));

3. Итерация с использованием итератора :

В случае, если мы находимся на Java 7 или более ранних версиях, мы можем просто перебрать итератор:

1
2
3
4
5
Iterator<Integer> itr = set.iterator();
  
while(itr.hasNext()) {
    System.out.println(itr.next());
}

4. Расширен для цикла:

Мы также можем использовать расширенный цикл for для прохождения через элементы:

1
2
3
for(Integer e : set) {
    System.out.println(e);
}

Вывод:

В этом уроке мы узнали, как создавать и работать с Java HashSet. Мы также знаем, что Java HashSet внутренне использует HashMap для своей реализации.

Оставьте первый комментарий.

Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотреть оригинальную статью здесь: HashSet In Java

Мнения, высказанные участниками Java Code Geeks, являются их собственными.