Рубрики
Без рубрики

Копирование наборов в Java

Изучите несколько различных способов копирования набора на Java.

Автор оригинала: baeldung.

1. Обзор

Проще говоря, Набор – это коллекция, которая не содержит повторяющихся элементов. В Java Set – это интерфейс, который расширяет интерфейс Коллекции .

В этом кратком руководстве мы рассмотрим различные способы копирования наборов в Java.

2. Конструктор копирования

Одним из способов копирования Набора является использование конструктора копирования реализации набора :

Set copy = new HashSet<>(original);

Конструктор копирования-это специальный тип конструктора, который используется для создания нового объекта с помощью копирование существующего объекта .

Здесь мы на самом деле не клонируем элементы данного набора. Мы просто копируем ссылки на объекты в новый набор. По этой причине каждое изменение, внесенное в один элемент, повлияет на оба набора.

3. Установить.Добавить все

Интерфейс Set имеет addAll метод . Он добавляет элементы коллекции в целевой набор. Поэтому мы можем использовать метод addAll для копирования элементов существующего набора в пустой набор:

Set copy = new HashSet<>();
copy.addAll(original);

4. Установить.клонировать

Давайте иметь в виду, что Set – это интерфейс, который расширяет Коллекцию интерфейс, поэтому нам нужно обратиться к объекту, реализующему Set интерфейс, чтобы создать другой экземпляр Set . Хэш-набор/|, Набор деревьев , LinkedHashSet, и EnumSet являются примерами Набора реализаций в Java.

Все эти Набор реализации имеют метод клонирования, так как все они реализуют Клонируемая интерфейс.

Итак, в качестве другого подхода к копированию набора мы можем вызвать метод набора clone :

Set copy = (Set) original.clone();

Давайте также отметим, что клонирование изначально происходит из Object.clone . Реализации набора переопределяют метод клонирования класса Объекта . Характер клона зависит от фактической реализации. Например, HashSet выполняет только поверхностную копию, хотя мы можем запрограммировать наш способ выполнения глубокой копии .

Как мы видим, мы вынуждены ввести клонированный объект в Set , поскольку метод clone фактически возвращает Объект .

5. JSON

Другой подход к копированию набора состоит в том, чтобы сериализовать его в строку JSON и создать новый набор из сгенерированной строки JSON . Также стоит отметить, что для этого подхода все элементы в наборе и ссылочные элементы должны быть сериализуемыми и что мы будем выполнять глубокую копию всех объектов .

В этом примере мы скопируем набор, используя методы сериализации и десериализации библиотеки Google Gson :

Gson gson = new Gson();
String jsonStr = gson.toJson(original);
Set copy = 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 с коллекторами для клонирования набора:

Set copy = original.stream()
    .collect(Collectors.toSet());

Одним из преимуществ Stream API является то, что он обеспечивает большее удобство , позволяя нам использовать пропуски , фильтры и многое другое.

8. Использование Java 10

Java 10 добавляет новую функцию в интерфейс Set , которая позволяет нам создавать неизменяемый набор из элементов данной коллекции :

Set copy = Set.copyOf(original);

Обратите внимание, что Обратите внимание, что ожидает, что не- нулевой параметр.

9. Заключение

В этой статье мы рассмотрели различные способы копирования наборов в Java.

Как всегда, ознакомьтесь с исходным кодом для наших примеров , в том числе для Java 10 .