Как присвоить часть значений hashMap'ы?
Есть общие поля которые повторяются. Их выделил в отдельную мапу. Их 6 но может быть 10-20
private final HashMap<String, String> mapDefault = new HashMap<>(); {
mapDefault.put("[STG_ID]", "getRecColumns");
mapDefault.put("[ODS_TAB]", "ODS.S$DWH_TABLE_NAME" );
mapDefault.put("[STG_TAB]", "STG.S$DWH_TABLE_NAME");
}
Хочу сделать так что бы другую мапу наследовать от этой, но так что бы она старую не перетёрла Я делаю
HashMap<String, String> falseDefault = mapDefault; {
falseDefault.put("[False]", "значение false"); // Я просто хочу дополнить дефолтную мапу новым значением
falseDefault.put("[STG_TAB]", "Абракатабра"); // просто хочу перетереть значение ключа [STG_TAB]
}
В итоге получается, что falseDefault == mapDefault. Но мне нужно не это, я хочу использовать 2 разные мапы для разных тестов. И вообще не 2, а 4. Или 5-10 мап, которые будут наследовать основные поля от дефолтной, почему нельзя сделать так что бы это были разные объекты? Кто вообще придумал что эти объекты должны быть одинаковыми, да я понимаю там передаются значения по ссылке, но я таких задач не знаю, мне нужны разные мапы, наследуемые от общей, думаю многие задумывались над этим. Более того если сделать 3 мапу она перетрёт первые 2. Мне нужно 4 уникальных мапы, у которых есть общие поля.
Ответы (1 шт):
Нужно делать копию, а не просто присваивать. Простое присваивание привязывает один и тот же объект к нескольким переменным (записывает ссылку на существующий объект в новую переменную). Из-за этого при изменении содержимого объекта в одной переменной эти же изменения отображаются в другой переменной - объект-то один и тот же на самом деле.
В данном случае достаточно "поверхностной" (shallow) копии:
HashMap<String, String> falseDefault = new HashMap<>(mapDefault);
// или
HashMap<String, String> falseDefault = (HashMap<String, String>) mapDefault.clone();
Проверяем:
System.out.println("mapDefault:");
System.out.println(mapDefault);
System.out.println("falseDefault:");
System.out.println(falseDefault);
Вывод:
mapDefault:
{[STG_ID]=getRecColumns, [STG_TAB]=STG.S$DWH_TABLE_NAME, [ODS_TAB]=ODS.S$DWH_TABLE_NAME}
falseDefault:
{[ODS_TAB]=ODS.S$DWH_TABLE_NAME, [False]=значение false, [STG_ID]=getRecColumns, [STG_TAB]=Абракатабра}
Видим, что значения в мапах разные.
Про копирование HashMap, в том числе про разницу между поверхностным и глубоким копированием: Copying a HashMap in Java