Мелкая копия карты в Java
как я понимаю, есть несколько способов (возможно и на других), чтобы создать мелкую копию 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();
один путь предпочтительнее другого, и если да, то почему?
стоит отметить, что второй способ дает предупреждение "непроверенный бросок". Поэтому вы должны добавить @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();
}
3 ответов
всегда лучше копировать с помощью конструктора копирования. clone()
в Java сломан (см. Так:Как правильно переопределить метод clone?).
Джош блох о конструкторе дизайна-копирования против клонирования
если вы читали пункт о клонировании в моей книге, особенно если Вы читаете между строк, вы будете знать, что я думаю
clone
глубоко нарушена. [...] Жаль, чтоCloneable
сломано, но оно происходит.
Блох (который, кстати, разработал и внедрил структуру коллекции) даже пошел дальше, сказав, что он только предоставляет clone()
метод просто "потому что люди ожидают этого". Он вообще не рекомендует его использовать.
Я думаю, что более интересная дискуссия заключается в том, является ли конструктор копирования лучше, чем копировальная фабрика, но это совсем другое обсуждение.
ни один из Два:конструктор что вы имеете в виду определяется для HashMap реализация карта (а также для других), но не на сам интерфейс карты (например,провайдер реализация интерфейса Map: вы не найдете этот конструктор).
С другой стороны, не рекомендуется использовать clone()
метод, как объяснил Джош блох.
In уважение интерфейса карты (и вашего вопроса, в котором вы спрашиваете, Как скопировать карту, а не HashMap), вы должны использовать карта#putAll():
копирует все сопоставления с указанной карты на эту карту (опционная деятельность). Эффект этого вызова эквивалентен вызов put (k, v) на этой карте один раз для каждого отображения от ключа k до значение v на указанной карте.
пример:
// HashMap here, but it works for every implementation of the Map interface
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy = new HashMap<String, Object>();
shallowCopy.putAll(data);
скопируйте карту, не зная ее реализации:
static final Map shallowCopy(final Map source) throws Exception {
final Map newMap = source.getClass().newInstance();
newMap.putAll(source);
return newMap;
}