Set в Java. Hashset пример
Данная статья:
- написана командой Vertex Academy.
- это одна из статей из нашего "Самоучителя по Java"
Привет! В нашем самоучителе мы рассмотрим следующие коллекции:
- Список (List) - см. статью "List в Java", а также "Что такое ArrayList"
- Множество (Set)
- Очередь (Queue) - см. статью "Queue в Java"
Это статья про структуру данных множество (Set) - один из способов хранения данных в Java.
Что такое множество (Set)
Как мы уже говорили, множество - это такой же способ хранения данных, как массив или список. Но особенность множества в том, что оно может хранить только уникальные значения.
Например, если у нас есть множество Integer-ов - в нем лежат числа 1, 2 , 3, 4 и 5:
Если мы попробуем добавить туда единицу, у нас не получится - потому что в множестве уже есть единица:
Таким образом, множество обеспечивает уникальность своих элементов. Можете быть спокойны - дублироваться в множествах ничего не будет.
Какие есть виды множеств
Как и List, множество - это всего лишь интерфейс. Давайте посмотрим, какие реализации существуют в Java.
Как видите, есть три основные виды множеств - HashSet, LinkedHashSet и TreeSet. Есть и другие - но пока мы только знакомимся с Set-ми, пока нам знать нам их совсем не обязательно 🙂
Среди HashSet, LinkedHashSet и TreeSet чаще всего используется HashSet.
Чем отличаются HashSet, LinkedHashSet и TreeSet
- HashSet хранит элементы в произвольном порядке, но зато быстро ищет. Подходит, если порядок Вам не важен, но важна скорость. Более того, для оптимизации поиска, HashSet будет хранить элементы так, как ему удобно.
- LinkedHashSet будет хранить элементы в порядке добавления, но зато работает медленнее.
- TreeSet хранит элементы отсортированными.
Отлично, теперь Вы знаете когда что использовать. Давайте посмотрим, как работать с множествами. Для удобства мы будем показывать примеры на HashSet.
Синтаксис
1 |
HashSet<String> myHashSet = new HashSet<String>(); |
Обратите внимание - как и в списках, мы указываем тип данных, которые находятся в множестве:
Операции с множествами
1. add() - добавляет элемент в множество
2. remove() - удаляет элемент из множества
3. contains() - определяет, есть ли элемент в множестве
4. size() - возвращает размер множества
5. clear() - удаляет все элементы из коллекции
6. isEmpty() - возвращает true если множество пустое, и false если там есть хотя бы 1 элемент
Пример 1
- add() - добавляет элемент в множество. Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); } } |
Тут мы добавили в множество Integer-ов три числа - 1, 2 и 3. Давайте теперь добавим цикл for each и выведем коллекцию на экран:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); for (int i : myHashSet) System.out.println(i); } } |
Получим:
Отлично, все как мы хотели 🙂 Давайте теперь для интереса попробуем добавить элемент, который у нас уже есть - например единицу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); // We add 1 one more time myHashSet.add(1); for (int i : myHashSet) System.out.println(i); } } |
В консоли получим то же самое:
Кстати, хотя тут мы не видим что элементы хранятся в произвольном порядке, не давайте себя обмануть 🙂 Всегда в порядке добавления будут храниться только элементы LinkedHashSet, а отсортировано - TreeSet. Сейчас нам просто повезло 🙂
Пример 2
- remove() - удаляет элемент из множества. Например, дополним код из примера выше:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); System.out.println("Before remove:"); for (int i : myHashSet) System.out.println(i); myHashSet.remove(1); System.out.println("After remove:"); for (int i : myHashSet) System.out.println(i); } } |
В консоли получаем:
Пример 3
- contains() - определяет, есть ли элемент в множестве. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); System.out.println("Does myHashSet contain '1'? " + myHashSet.contains(1)); System.out.println("Does myHashSet contain '11'? " + myHashSet.contains(11)); } } |
В консоли получим:
Пример 4
- size() - возвращает размер множества. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); System.out.println("Before we add anything myHashSet size is " + myHashSet.size()); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); System.out.println("Now myHashSet size is " + myHashSet.size()); } } |
Получаем:
Пример 5
- clear() - удаляет все элементы из коллекции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); System.out.println("Before we add anything myHashSet size is " + myHashSet.size()); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); System.out.println("Now myHashSet size is " + myHashSet.size()); myHashSet.clear(); System.out.println("After clear myHashSet size is " + myHashSet.size()); } } |
Получаем:
Пример 6
- isEmpty() - возвращает true если множество пустое, и false если там есть хотя бы один элемент:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Test { public static void main(String[] args) { HashSet<Integer> myHashSet = new HashSet<Integer>(); System.out.println("At the beginning myHashSet is empty: " + myHashSet.isEmpty()); myHashSet.add(1); myHashSet.add(2); myHashSet.add(3); System.out.println("After adding elements myHashSet is empty: " + myHashSet.isEmpty()); myHashSet.clear(); System.out.println("After clear myHashSet is empty: " + myHashSet.isEmpty()); } } |
В результате получаем:
Надеемся, что наша статья была Вам полезна. Можно записаться к нам на курсы по Java на сайте.