Как присвоить часть значений hashMap'ы?

Рейтинг: 0Ответов: 1Опубликовано: 26.01.2023

Есть общие поля которые повторяются. Их выделил в отдельную мапу. Их 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