HashSet содержит неповторяющиеся коллекцию элементов.
HashSet содержит элементы без сортировки.
HashSet позволяет быстро определить, есть такой элемент или нет (быстро потому что, использует индекс, который вычисляется из хэш-кода элемента).
HashSet имеет методы
Add,
Remove,
Contains и использует хэш-реализацию, поэтому эти методы занимают
1 действие (методы
Contains и
Remove в
ArrayList занимают
n действий.)
HashSet не синхронизирован. Если несколько потоков одновременно обращаются к хеш-набору, и хотя бы один из потоков изменяет
HashSet, он должен быть синхронизирован внешне.
HashSet
реализует
interface Set<E> это коллекция уникальных элементов
Java
Создаем новое Java консольное приложение ... и напишем код
package org.example;
import java.util.Stack;
public class Program {
public static void main(String[] args)
{
HashSet<String> myHashSet1 = new HashSet<String>();
// добавляем элементы
myHashSet1.add("Car");
myHashSet1.add("House");
myHashSet1.add("Book");
// проверить есть элемент в коллекции
Boolean hasElement = myHashSet1.contains("House");
// hasElement = true
// пройти по всем элементам
for(String str:myHashSet1)
{
System.out.println(str);
}
// element1 = Car
// element2 = Book
// element3 = House
// удаляем элемент "Book"
myHashSet1.remove("Book");
// element1 = Car
// element3 = House
}
}
class HashSet<E> внутри содержит
HashMap:
Java
class HashSet<E>
{
HashMap<E,Object> map;
...
// во всех public конструкторах создается HashMap
public HashSet(...) {
map = new HashMap<>(...);
}
}
Java
class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
{
HashMap<E,Object> map;
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = HashMap.newHashMap(Math.max(c.size(), 12));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
private HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public int size() {
return map.size();
}
public boolean isEmpty() {
return map.isEmpty();
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public void clear() {
map.clear();
}
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
@java.io.Serial
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
...
}
@java.io.Serial
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
...
}
public Spliterator<E> spliterator() {
return new HashMap.KeySpliterator<>(map, 0, -1, 0, 0);
}
@Override
public Object[] toArray() {
return map.keysToArray(new Object[map.size()]);
}
@Override
public <T> T[] toArray(T[] a) {
return map.keysToArray(map.prepareArray(a));
}
public static <T> HashSet<T> newHashSet(int numElements) {
if (numElements < 0) {
throw new IllegalArgumentException("Negative number of elements: " + numElements);
}
return new HashSet<>(HashMap.calculateHashMapCapacity(numElements));
}
}
Подробнее о методах в Java документации: