Что такое Set
Это интерфейс, объявленный в пакете java.util. Он расширяет коллекцию, помогает создавать неупорядоченный список, в котором недопустимы уже используемые значения.
- Set запрещает дублирование. Каждый элемент в наборе уникален. Если добавить элемент, который уже присутствует в наборе, операция не изменит набор. Просто вернется значение false.
- Неупорядоченная коллекция — этот интерфейс не гарантирует порядок элементов. Поддерживать порядок вставки можно с помощью специальных реализаций (например, LinkedHashSet).
- Большинство реализаций set допускают по крайней мере один элемент null. Некоторые виды (например, TreeSet) не допускают элементов null и генерируют исключение NullPointerException.
Какие существуют виды множеств
Это HashSet, TreeSet и LinkedHashSet. В Set каждый элемент хранится только в одном экземпляре, а в разных реализациях Set разный порядок расположения объектов. В HashSet он определяется сложным алгоритмом. Если важна последовательность хранения, применяют TreeSet, в котором объекты хранятся в сортировке по возрастанию в порядке сравнения. В LinkedHashSet они располагаются в порядке сложения.
HashSet
HashSet — наиболее используемая реализация. Для хранения объектов интерфейс использует хэш-таблицу.
- Как и во всех реализациях, в HashSet не допускается дублирование.
- Порядок не гарантирован — расположение итераций в HashSet непредсказуемое, основано на хэш-коде.
- HashSet допускает использование нулевых элементов, но только одного, поскольку дублирование запрещено.
- Производительность: HashSet обеспечивает постоянную работу за время выполнения базовых операций (добавление, удаление, сохранение, если хэш-функция правильно распределяет элементы по сегментам.
- Подходит для проектов, где важна коллекция уникальных объектов и не важен их порядок.
Пример:
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // Duplicate, won't be added
LinkedHashSet
LinkedHashSet расширяет HashSet и поддерживает двусвязный список.
- Доступны вставки элементов. При повторном просмотре LinkedHashSet они будут возвращены в том порядке, в котором были вставлены.
- Производительность немного ниже, чем у HashSet, из-за затрат на поддержание связанного списка.
- Полезен, когда нужна коллекция, которая не содержит дубликатов, поддерживает порядок вставки.
Пример:
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Cherry");
linkedHashSet.add("Apple");
// Iterating will return elements in the order Cherry, Apple
TreeSet
TreeSet — реализация, в которой используется древовидная карта (Red-Black tree).
- Элементы в древовидном наборе сортируются по их естественному порядку или с помощью средства сравнения, предоставляемого в заданное время.
- Производительность: обеспечивает логарифмические (n) затраты времени на ряд методов (добавление, удаление, сохранение).
- Нет нулевых элементов, нельзя сравнивать null с ненулевыми.
- Подходит для хранения элементов в отсортированном виде.
Например:
Set<String> treeSet = new TreeSet<>();
treeSet.add("Pineapple");
treeSet.add("Apple");
// Iterating will return elements in order Apple, Pineapple
Методы Java Set
Set в Java имеет большое количество методов. Они полезны для работы с различными операциями.
Добавление элемента
Метод add() вставляет новое значение. Он возвращает true или false в зависимости от наличия объекта. False, если элемент присутствует в наборе, и true, если его нет.
Пример:
public class SetAddFruit {
public static void main(String[] args) {
Set<String> colors = new HashSet<>();
// Adding elements to the set
boolean isAdded1 = colors.add("Red");
boolean isAdded2 = colors.add("Green");
boolean isAdded3 = colors.add("Blue");
System.out.println("Is 'Red' added? : " + isAdded1); // true
System.out.println("Is 'Green' added? : " + isAdded2); // true
System.out.println("Is 'Blue' added? : " + isAdded3); // true
// Trying to add a duplicate element
boolean isAddedDuplicate = colors.add("Red");
System.out.println("Is duplicate 'Red' added? : " + isAddedDuplicate); // false
System.out.println("Set contents: " + colors); // [Red, Green, Blue]
}
}
Удаление объектов
Set.clear() помогает вырезать множество ненужных объектов set:
import java.util.HashSet;
public class HashSetDemo {
public static void main(String args[]) {
// create hash set
HashSet <Integer> newset = new HashSet <>();
// populate hash set
newset.add(1);
newset.add(2);
newset.add(3);
// checking elements in hash set
System.out.println("Hash set values: "+ newset);
// clear the set
newset.clear();
// print the set
System.out.println("Hash set values after clearing: "+ newset);
}
}
Порядок элементов
Iterator() нужен для выполнения объектов в поставленном порядке.
import java.util.Iterator;
import java.util.Set;
public class IterateSetEx {
public static void main(String[] args)
{
// Create a generic set object of type String.
Set<String> s = new HashSet<String>(); // s.size() is 0.
int size = s.size();
System.out.println("Size before adding elements: " +size);
// Adding elements to set.
s.add("Orange"); // s.size() is 1.
s.add("Red"); // s.size() is 2.
s.add("Blue"); // s.size() is 3.
s.add("Yellow"); // s.size() is 4.
s.add("Green"); // s.size() is 5.
// Displaying elements of set.
System.out.println("Elements in set");
System.out.println(s);
// Iterating set in the forward direction.
// Creating an Iterator object using iterator() method.
Iterator<String> itr = s.iterator();
System.out.println("Iteration using Iterator method");
while(itr.hasNext())
{
Object str = itr.next();
System.out.println(str);
}
}
}
Размер
Set.size() помогает оценить размер объектов:
import java.util.HashSet;
import java.util.Set;
public class SetSizeExample {
public static void main(String[] args) {
Set<String> fruits = new HashSet<>();
// Check the size of an empty set
System.out.println("Size of empty set: " + fruits.size()); // 0
fruits.add("Limon");
fruits.add("Strawberry");
fruits.add("Orange");
// Check the size after adding elements
System.out.println("Size after adding three fruits: " + fruits.size()); // 3
// Adding duplicate elements
fruits.add("Limon");
fruits.add("Strawberry");
// Check the size after adding duplicate elements
System.out.println("Size after adding duplicate fruits: " + fruits.size()); // 3
}
}
Поиск объектов
Для этой задачи применяют contains():
public class HashSetFalt {
public static void main(String args[]) {
// create hash set
HashSet <Integer> newset = new HashSet <>();
// populate hash set
newset.add(1);
newset.add(2);
newset.add(3);
// print the set
System.out.println("Hash set: "+ newset);
// checking elements in hash set
System.out.println("Hash set contains 1: "+ newset.contains(1));
System.out.println("Hash set contains 4: "+ newset.contains(4));
}
}
Возвращение адреса
hashCode() возвращает значение хэш-кода (адрес объекта в set).
import java.util.*;
public class GFG {
public static void main(String[] args)
{
// creating an HashSet
HashSet<Integer> arr
= new HashSet<Integer>();
// using add() to initialize values
// [1, 2, 3, 4]
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
// print HashSet
System.out.println("HashSet: "
+ arr);
// Get the hashCode value
// using hashCode() value
System.out.println("HashCode value: "
+ arr.hashCode());
}
}