Насколько я понимаю, есть несколько способов (возможно, и других) создать мелкую копию a Map
на Java:
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;
// first way
shallowCopy = new HashMap<String, Object>(data);
// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();
Один способ предпочтительнее другого, и если да, то почему?
Стоит упомянуть, что второй способ выдает предупреждение «Unchecked Cast». Поэтому вам нужно добавить, @SuppressWarnings("unchecked")
чтобы обойти это, что немного раздражает (см. Ниже).
@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
// return a shallow copy of the data map
return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
java
map
clone
shallow-copy
DCP
источник
источник
Ответы:
Всегда лучше копировать с помощью конструктора копирования.
clone()
в Java не работает (см. SO: Как правильно переопределить метод клонирования? ).Джош Блох о дизайне - Конструктор копирования против клонирования
Блох (который, кстати, разработал и реализовал фреймворк Collection) даже пошел дальше, заявив, что он предоставляет
clone()
метод только «потому, что люди этого ожидают». Он вообще НЕ рекомендует его использовать.Я думаю, что более интересными являются споры о том, лучше ли конструктор копирования или фабрика копирования, но это совсем другое обсуждение.
источник
Ни один из двух: конструктор, на который вы ссылаетесь, определен для реализации HashMap карты (как и для других), но не для самого интерфейса карты (например, рассмотрите реализацию интерфейса карты Provider : вы не найдет этот конструктор).
С другой стороны
clone()
, как объяснил Джош Блох, использовать этот метод не рекомендуется .Что касается интерфейса карты (и вашего вопроса, в котором вы спрашиваете, как скопировать карту, а не HashMap), вы должны использовать Map # putAll () :
Пример:
источник
Map
которой есть конструктор копирования, тогда нет причин не использовать конструктор копирования?putAll
вам не нужно знать, имеет лиMap
используемая вами реализация конструктор копирования или нет.Map
Таким образом, простой конструктор копирования любой реализации является избыточным.Скопируйте карту, не зная ее реализации:
источник
<K,V>
параметров типа, чтобы обеспечить безопасность типа.