Создание HashMap на основе существующего Map-объекта

Создание HashMap на основе существующего Map-объекта

HashMap можно создать на основе другого Map-объекта, передав его в конструктор. Но при этой операции типы ключей и значений нового Map-объекта должны совпадать с типами исходного, либо быть их суперклассами.


Map<String, ArrayList<Integer>> m1 = new HashMap<>();
Integer[] arr1 = {1, 2, 3, 4};
Integer[] arr2 = {5, 6, 7};

m1.put("one", new ArrayList<>(Arrays.asList(arr1)));
m1.put("two", new ArrayList<>(Arrays.asList(arr2)));
System.out.println(m1); // {one=[1, 2, 3, 4], two=[5, 6, 7]}

Map<Object, List> m2 = new HashMap<>(m1); // тоже корректная запись
System.out.println(m2); // {two=[5, 6, 7], one=[1, 2, 3, 4]}
Использование суперклассов для типов ключей и значений ограничивает набор операций, которые можно выполнять при непосредственном обращении к ключам и значениям.


Set<Map.Entry<Object, List>> entries = m2.entrySet();
for (Map.Entry<Object, List> entry : entries) {
      System.out.println(entry.getKey() + " : " + entry.getValue());
}
В этом примере мы не можем вызвать, например, entry.getKey().toUpperCase(), т.к. у Object нет такого метода.

Такая запись вызовет ошибку компиляции:


Set<Map.Entry<String, ArrayList<Integer>>> entries = m2.entrySet();
// невозможно привести Set<Map.Entry<Object, List>>
// к Set<Map.Entry<String, ArrayList<Integer>>>
Коллекции