Две карты равны, если одни и те же карты клавиш имеют одинаковые значения. (В некоторых реализациях.) Таким образом, чтобы проверить равенство, необходимо проверить равенство каждого члена.
Следовательно, если карта содержит себя, вы получите бесконечный рекурсивный анализ проверок равенства.
То же самое относится к хэшам, поскольку они могут быть рассчитаны в зависимости от хэшей элементов на карте.
Пример:
Map<Int, Object> ma;
Map<Int, Object> mb;
Map<Int, Object> mc;
ma.put(1, ma);
ma.put(2, mb);
mc.put(1, ma);
mc.put(2, mb);
Как человек, мы можем видеть ma
и mc
равны по определению. На обеих картах компьютер увидит две карты на mb (пустую карту), что хорошо. Он увидит 1 карту на другой карте как в mc, так и в ma. Он проверяет, равны ли эти карты. Чтобы определить это, он проверяет снова, если два значения для 1 равны. И опять.
Обратите внимание, что это не относится ко всем реализациям. Некоторые реализации могут проверять равенство по месту в памяти, объект сохраняется, но каждая рекурсивная проверка будет циклически бесконечно.
Если я правильно помню, метод equals проверяет, содержит ли содержимое карт равны. и это делается с использованием метода equals содержимого, то есть самого отображения. Я уверен, что мы закончили с StackOverflowError –
Можете ли вы выглядеть так, как выглядит карта? возможно, это вызовет бесконечный цикл? Просто мысль – Kevin
@MarcoForberg Если я правильно помню, лучше всего проверить, действительно ли объект, с которым вы сравниваете, на самом деле, и сразу же верните истину, если это так. –