Включите исполнение JavaScript в браузере, чтобы запустить приложение.
11 мар 2025

Что такое Set в Java

Set — это интерфейс в Java. Его можно применять для работы с неупорядоченными коллекциями, с уникальными элементами. В статье мы рассмотрим этот интерфейс и его реализации на языке Java, методы работы с набором, а также приведем несколько примеров.

Что такое 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
java

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
java

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

Методы 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]
    }
}
java

Удаление объектов

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);

   }    

}
java

Порядок элементов

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); 

   } 

 } 

}
java

Размер

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

    }

}
java

Поиск объектов

Для этой задачи применяют 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));
      
   }    
}
java

Возвращение адреса

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());
    }
}
java