Java HashSet

Java 集合框架Java Collections Framework

HashSet реализован на основе HashMap и представляет собой коллекцию, не допускающую дублирующихся элементов.

HashSet допускает значения null.

HashSet не упорядочен, то есть не сохраняет порядок вставки.

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

HashSet реализует интерфейс Set.

Элементы в HashSet на самом деле являются объектами. Некоторые распространённые базовые типы могут использовать свои классы-обёртки.

Классы-обёртки, соответствующие базовым типам, следующие:

Базовый типТип ссылки
логическое значениеBoolean
байтByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charСимвол

Класс HashSet находится в пакете java.util. Перед использованием его нужно импортировать. Формат синтаксиса следующий:

import java.util.HashSet; // 引入 HashSet 类

В следующем примере мы создаём объект HashSet sites для хранения строковых элементов:

HashSet<String> sites = new HashSet<String>();

Добавление элементов

Класс HashSet предоставляет много полезных методов. Вы можете использовать метод add() для добавления элементов:

Пример

// Импорт класса 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");  // Повторяющиеся элементы не будут добавлены
        System.out.println(sites);
    }
}

Выполните приведённый выше код; результат вывода следующий:

[Google, Example, Zhihu, Taobao]

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

Проверить, существует ли элемент

Мы можем использовать метод contains(), чтобы определить, существует ли элемент в коллекции:

Пример

// Импорт класса 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");  // Повторяющиеся элементы не будут добавлены
        System.out.println(sites.contains("Taobao"));
    }
}

Выполните приведённый выше код; результат вывода следующий:

true

Удаление элементов

Мы можем использовать метод remove() для удаления элементов из коллекции:

Пример

// Импорт класса 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");     // Повторяющиеся элементы не будут добавлены
        sites.remove("Taobao");  // Удалить элемент; возвращает true, если удаление успешно, иначе false
        System.out.println(sites);
    }
}

Выполните приведённый выше код; результат вывода следующий:

[Google, Example, Zhihu]

Чтобы удалить все элементы из коллекции, можно использовать метод clear:

Пример

// Импорт класса 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");     // Повторяющиеся элементы не будут добавлены
        sites.clear();  
        System.out.println(sites);
    }
}

Выполните приведённый выше код; результат вывода следующий:

[]

Вычислить размер

Чтобы подсчитать количество элементов в HashSet, можно использовать метод size():

Пример

// Импорт класса 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");     // Повторяющиеся элементы не будут добавлены
        System.out.println(sites.size());  
    }
}

Выполните приведённый выше код; результат вывода следующий:

4

Итерация HashSet

Вы можете использовать for-each для перебора элементов в HashSet.

Пример

// Импорт класса 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 集合框架Java Collections Framework

Другие расширения