Я не уверен, что действительно понимаю ваше описание того, что вы делаете, но это выделяется:
this.containers.put(this.currentHashMapKey, tempHashMap);
// ...
tempHashMap.clear();
Когда вы звоните clear()
, вы удаляете все записи из tempHashMap
.Поскольку это объект карты, который вы добавили в качестве значения на карту containers
, вы также очищаете его там .
Одним из возможных решений является создание нового tempHashMap
на каждой итерации ... и не вызывайте clear()
после добавления его в containers
.
Объяснение:
Я думал, что это создало копиюHashMap, когда вы добавили его.
Вы, кажется, думаете, что
this.containers.put(this.currentHashMapKey, tempHashMap);
создаст копию tempHashMap
.
Это НЕ так.
Фактически, то, что вы делаете, сохраняет ссылку на вашей «временной карте хеша» в качестве значения записи на карте container
.В самом деле, если вы затем повторно используете временную карту, вы получите множество ссылок на этот один объект карты в вашей карте containers
.
Операция Map::put(key, value)
не копирует / клонирует / что бы то ни было key
объект или value
объект.Он просто хранит ссылки в записи карты.Если вы затем мутируете эти объекты:
- , изменяющий
value
, изменяет то, что видно через карту - , изменяющий
key
, нарушает отображение (!).
Не перезаписывает ли он предыдущий HashMap всякий раз, когда я создаю новый?
Нет, не будет.Он создает новый один.Учтите это:
Map<String, String> tempHashMap = new HashMap<>();
tempHashMap.put("key", "value");
tempHashMap = new HashMap<>();
Третий оператор создает новый объект HashMap
и назначает ссылку на переменную tempHashMap
.Это заменяет исходное значение ссылки в переменной, но не влияет на первый объект HashMap
.Если у вас все еще была ссылка на исходный объект, вы все равно можете найти «ключ» и получить соответствующее «значение».
Это базовая семантика Java-определения.Присвоение объектов (либо с помощью =
, либо путем передачи параметра) ТОЛЬКО назначает ссылки.Это НЕ перезаписывает фактическое состояние объекта.
Это отличается от C и C ++, где назначение объектов (или структур) и назначение указателей на объекты / структуры являются принципиально различными операциями.