Класс Java HashSet: Руководство для начинающих

Введение

Привет, будущие разработчики Java! Сегодня мы погрузимся в увлекательный мир HashSet в Java. Не волнуйтесь, если вы новичок в программировании; я проведу вас по этому пути шаг за шагом, как я делал это для многих студентов на протяжении многих лет своей преподавательской деятельности. Представьте HashSet как магическую коробку, которая может хранить уникальные элементы - дубликаты не допускаются! Это как специальный ящик, в который вы можете положить только одну пару каждого типа носков. Давайте начнем!

Java - HashSet

Объявление класса

В Java HashSet является частью Java Collections Framework. Чтобы использовать его, сначала нужно импортировать:

import java.util.HashSet;

Основное объявление HashSet выглядит так:

HashSet<E> hs = new HashSet<E>();

Здесь 'E' является占位符ом для типа элементов, которые вы хотите хранить в вашем HashSet. Например, если вы хотите хранить строки:

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

Параметры

При создании HashSet вы можете указать два необязательных параметра:

  1. Начальная емкость: количество "корзин" HashSet будет использовать для хранения элементов.
  2. Фактор нагрузки: мера, насколько полный может быть HashSet, прежде чем он автоматически увеличится в размере.

Сейчас не стоит слишком много беспокоиться по этому поводу. Представьте их как расширенные настройки для вашей магической коробки!

Конструкторы класса

HashSet предоставляет четыре конструктора. Давайте рассмотрим каждый из них:

// Конструктор 1: Создает пустой HashSet с начальной емкостью по умолчанию (16) и фактором нагрузки (0.75)
HashSet<String> set1 = new HashSet<>();

// Конструктор 2: Создает HashSet, содержащий элементы указанной коллекции
Collection<String> collection = Arrays.asList("Apple", "Banana", "Cherry");
HashSet<String> set2 = new HashSet<>(collection);

// Конструктор 3: Создает пустой HashSet с указанной начальной емкостью и фактором нагрузки по умолчанию (0.75)
HashSet<String> set3 = new HashSet<>(20);

// Конструктор 4: Создает пустой HashSet с указанной начальной емкостью и фактором нагрузки
HashSet<String> set4 = new HashSet<>(20, 0.8f);

Методы класса

Вот таблица наиболее часто используемых методов HashSet:

Метод Описание
add(E e) Добавляет указанный элемент в это множество, если он еще не присутствует
clear() Удаляет все элементы из этого множества
contains(Object o) Возвращает true, если это множество содержит указанный элемент
isEmpty() Возвращает true, если это множество не содержит элементов
remove(Object o) Удаляет указанный элемент из этого множества, если он присутствует
size() Возвращает количество элементов в этом множестве

Наследованные методы

HashSet наследует методы от своих родительских классов. Некоторые заметные из них включают:

  • Из Set: addAll(), containsAll(), equals(), hashCode(), removeAll(), retainAll()
  • Из Collection: iterator(), toArray()
  • Из Object: clone(), finalize(), getClass(), notify(), notifyAll(), wait()

Пример добавления элементов в HashSet

Давайте применим наши знания на интересном примере. Представьте, что мы создаем программу для отслеживания уникальных вкусов мороженого в нашем магазине:

import java.util.HashSet;

public class IceCreamShop {
public static void main(String[] args) {
// Создаем новый HashSet для хранения вкусов мороженого
HashSet<String> flavors = new HashSet<>();

// Добавляем некоторые вкусы
flavors.add("Vanilla");
flavors.add("Chocolate");
flavors.add("Strawberry");
flavors.add("Mint Chip");

// Пытаемся добавить дубликат
boolean added = flavors.add("Vanilla");

System.out.println("Vanilla добавлен повторно? " + added);
System.out.println("Наши вкусы мороженого: " + flavors);
System.out.println("У нас " + flavors.size() + " уникальных вкусов!");

// Проверяем, есть ли у нас определенный вкус
String searchFlavor = "Rocky Road";
if (flavors.contains(searchFlavor)) {
System.out.println("Да, у нас есть " + searchFlavor + "!");
} else {
System.out.println("Извините, у нас нет " + searchFlavor + ".");
}

// Удаляем вкус
flavors.remove("Strawberry");
System.out.println("Обновленные вкусы после удаления Strawberry: " + flavors);
}
}

Вывод

Когда вы выполните эту программу, вы увидите что-то вроде этого:

Vanilla добавлен повторно? false
Наши вкусы мороженого: [Vanilla, Mint Chip, Chocolate, Strawberry]
У нас 4 уникальных вкуса!
Извините, у нас нет Rocky Road.
Обновленные вкусы после удаления Strawberry: [Vanilla, Mint Chip, Chocolate]

Разберем, что произошло:

  1. Мы создали HashSet под названием flavors для хранения наших вкусов мороженого.
  2. Мы добавили четыре вкуса: Ваниль, Шоколад, Ягодный и Мятно-шоколадный.
  3. Мы попытались добавить Ваниль еще раз, но метод add() вернул false, так как HashSet не допускает дубликатов.
  4. Мы вывели все наши вкусы. Заметьте, порядок может отличаться от того, в котором мы добавляли их - HashSet не поддерживает порядок вставки.
  5. Мы проверили, есть ли у нас вкус Rocky Road с помощью contains(). Нет, поэтому вывелось сообщение с извинением.
  6. Наконец, мы удалили Ягодный и вывели обновленный набор вкусов.

Итак, у вас есть! Вы только что создали свой первый HashSet и использовали некоторые из его самых важных методов. Помните, HashSet отлично подходит, когда вам нужно хранить уникальные элементы и не важен порядок. Это как мешок с мармеладом, где каждый мармелад является разным цветом - вы легко можете проверить, есть ли у вас определенный цвет, но вы не можете контролировать порядок, в котором они выходят, когда вы высыпаете мешок.

Когда вы продолжите свое путешествие по Java, вы обнаружите, что HashSet чрезвычайно полезен во многих сценариях. Практикуйтесь и скоро станете профи в использовании HashSet! Счастливого кодирования!

Credits: Image by storyset