Вступление:
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, являются их собственными. |