Java HashSet
HashSet реализован на основе HashMap и представляет собой коллекцию, не допускающую дублирующихся элементов.
HashSet допускает значения null.
HashSet не упорядочен, то есть не сохраняет порядок вставки.
HashSet не является потокобезопасным. Если несколько потоков попытаются одновременно изменить HashSet, конечный результат не определён. При доступе к HashSet из нескольких потоков необходимо явно синхронизировать параллельный доступ к нему.
HashSet реализует интерфейс Set.
Элементы в HashSet на самом деле являются объектами. Некоторые распространённые базовые типы могут использовать свои классы-обёртки.
Классы-обёртки, соответствующие базовым типам, следующие:
| Базовый тип | Тип ссылки |
|---|---|
| логическое значение | Boolean |
| байт | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Символ |
Класс HashSet находится в пакете java.util. Перед использованием его нужно импортировать. Формат синтаксиса следующий:
import java.util.HashSet; // 引入 HashSet 类
В следующем примере мы создаём объект HashSet sites для хранения строковых элементов:
HashSet<String> sites = new HashSet<String>();
Добавление элементов
Класс HashSet предоставляет много полезных методов. Вы можете использовать метод add() для добавления элементов:
Пример
import java.util.HashSet;
public class ExampleTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<String>();
sites.add("Google");
sites.add("Example");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Example"); // Повторяющиеся элементы не будут добавлены
System.out.println(sites);
}
}
Выполните приведённый выше код; результат вывода следующий:
[Google, Example, Zhihu, Taobao]В приведённом выше примере Example был добавлен дважды, но в коллекции он появляется только один раз, потому что каждый элемент в коллекции должен быть уникальным.
Проверить, существует ли элемент
Мы можем использовать метод contains(), чтобы определить, существует ли элемент в коллекции:
Пример
import java.util.HashSet;
public class ExampleTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<String>();
sites.add("Google");
sites.add("Example");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Example"); // Повторяющиеся элементы не будут добавлены
System.out.println(sites.contains("Taobao"));
}
}
Выполните приведённый выше код; результат вывода следующий:
true
Удаление элементов
Мы можем использовать метод remove() для удаления элементов из коллекции:
Пример
import java.util.HashSet;
public class ExampleTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<String>();
sites.add("Google");
sites.add("Example");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Example"); // Повторяющиеся элементы не будут добавлены
sites.remove("Taobao"); // Удалить элемент; возвращает true, если удаление успешно, иначе false
System.out.println(sites);
}
}
Выполните приведённый выше код; результат вывода следующий:
[Google, Example, Zhihu]
Чтобы удалить все элементы из коллекции, можно использовать метод clear:
Пример
import java.util.HashSet;
public class ExampleTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<String>();
sites.add("Google");
sites.add("Example");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Example"); // Повторяющиеся элементы не будут добавлены
sites.clear();
System.out.println(sites);
}
}
Выполните приведённый выше код; результат вывода следующий:
[]
Вычислить размер
Чтобы подсчитать количество элементов в HashSet, можно использовать метод size():
Пример
import java.util.HashSet;
public class ExampleTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<String>();
sites.add("Google");
sites.add("Example");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Example"); // Повторяющиеся элементы не будут добавлены
System.out.println(sites.size());
}
}
Выполните приведённый выше код; результат вывода следующий:
4
Итерация HashSet
Вы можете использовать for-each для перебора элементов в HashSet.
Пример
import java.util.HashSet;
public class ExampleTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<String>();
sites.add("Google");
sites.add("Example");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Example"); // Повторяющиеся элементы не будут добавлены
for (String i : sites) {
System.out.println(i);
}
}
}
Выполните приведённый выше код; результат вывода следующий:
Google Example Zhihu Taobao
Общие методы HashSet
| Метод | Возвращаемое значение | Описание | Пример |
|---|---|---|---|
add(E e) |
boolean |
Добавить элемент в коллекцию; возвращает true при успехеtrue; возвращает false для дублирующихся элементовfalse。 |
set.add("Java"); |
remove(Object o) |
boolean |
Удаляет указанный элемент; возвращает true при успехеtrue; возвращает false, если элемент не существуетfalse。 |
set.remove("Python"); |
contains(Object o) |
boolean |
Проверяет, содержит ли коллекция указанный элемент. | if (set.contains("Java")) { ... } |
size() |
int |
Возвращает количество элементов в коллекции. | int count = set.size(); |
isEmpty() |
boolean |
Определяет, пуста ли коллекция. | if (set.isEmpty()) { ... } |
clear() |
void |
Очищает все элементы коллекции. | set.clear(); |
iterator() |
Iterator<E> |
Возвращает итератор коллекции для обхода элементов. | for (String s : set) { ... } |
toArray() |
Object[] |
Преобразует коллекцию в массив. | Object[] arr = set.toArray(); |
toArray(T[] a) |
T[] |
Преобразует коллекцию в массив указанного типа. | String[] arr = set.toArray(new String[0]); |
addAll(Collection<? extends E> c) |
boolean |
Добавляет все элементы другой коллекции (операция объединения). | set.addAll(Arrays.asList("A", "B")); |
retainAll(Collection<?> c) |
boolean |
Оставляет только элементы, общие с указанной коллекцией (операция пересечения). | set.retainAll(otherSet); |
removeAll(Collection<?> c) |
boolean |
Удаляет элементы, общие с указанной коллекцией (операция разности). | set.removeAll(otherSet); |
Для получения дополнительных методов API можно обратиться к:https://www.manual/jdk11api/java/util/HashSet.html
Другие расширения
Java Collections Framework