1. Обзор
Проще говоря, Набор – это коллекция, которая не содержит повторяющихся элементов. В Java Set – это интерфейс, который расширяет интерфейс Коллекции .
В этом кратком руководстве мы рассмотрим различные способы копирования наборов в Java.
2. Конструктор копирования
Одним из способов копирования Набора является использование конструктора копирования реализации набора :
Setcopy = new HashSet<>(original);
Конструктор копирования-это специальный тип конструктора, который используется для создания нового объекта с помощью копирование существующего объекта .
Здесь мы на самом деле не клонируем элементы данного набора. Мы просто копируем ссылки на объекты в новый набор. По этой причине каждое изменение, внесенное в один элемент, повлияет на оба набора.
3. Установить.Добавить все
Интерфейс Set имеет addAll метод . Он добавляет элементы коллекции в целевой набор. Поэтому мы можем использовать метод addAll для копирования элементов существующего набора в пустой набор:
Setcopy = new HashSet<>(); copy.addAll(original);
4. Установить.клонировать
Давайте иметь в виду, что Set – это интерфейс, который расширяет Коллекцию интерфейс, поэтому нам нужно обратиться к объекту, реализующему Set интерфейс, чтобы создать другой экземпляр Set . Хэш-набор/|, Набор деревьев , LinkedHashSet, и EnumSet являются примерами Набора реализаций в Java.
Все эти Набор реализации имеют метод клонирования, так как все они реализуют Клонируемая интерфейс.
Итак, в качестве другого подхода к копированию набора мы можем вызвать метод набора clone :
Setcopy = (Set ) original.clone();
Давайте также отметим, что клонирование изначально происходит из Object.clone . Реализации набора переопределяют метод клонирования класса Объекта . Характер клона зависит от фактической реализации. Например, HashSet выполняет только поверхностную копию, хотя мы можем запрограммировать наш способ выполнения глубокой копии .
Как мы видим, мы вынуждены ввести клонированный объект в Set , поскольку метод clone фактически возвращает Объект .
5. JSON
Другой подход к копированию набора состоит в том, чтобы сериализовать его в строку JSON и создать новый набор из сгенерированной строки JSON . Также стоит отметить, что для этого подхода все элементы в наборе и ссылочные элементы должны быть сериализуемыми и что мы будем выполнять глубокую копию всех объектов .
В этом примере мы скопируем набор, используя методы сериализации и десериализации библиотеки Google Gson :
Gson gson = new Gson(); String jsonStr = gson.toJson(original); Setcopy = gson.fromJson(jsonStr, Set.class);
6. Apache Commons Lang
В Apache Commons Lang есть класс SerializationUtils , который предоставляет специальный метод – клонирование – который можно использовать для клонирования данного объекта. Мы можем использовать этот метод для копирования набора:
for (T item : original) { copy.add(SerializationUtils.clone(item)); }
Отметим, что SerializationUtils.clone ожидает, что его параметр расширит Сериализуемый класс .
7. Коллекционеры.toSet
Или мы можем использовать потоковый API Java 8 с коллекторами для клонирования набора:
Setcopy = original.stream() .collect(Collectors.toSet());
Одним из преимуществ Stream API является то, что он обеспечивает большее удобство , позволяя нам использовать пропуски , фильтры и многое другое.
8. Использование Java 10
Java 10 добавляет новую функцию в интерфейс Set , которая позволяет нам создавать неизменяемый набор из элементов данной коллекции :
Setcopy = Set.copyOf(original);
Обратите внимание, что Обратите внимание, что ожидает, что не- нулевой параметр.
9. Заключение
В этой статье мы рассмотрели различные способы копирования наборов в Java.
Как всегда, ознакомьтесь с исходным кодом для наших примеров , в том числе для Java 10 .