Что вызывает непредсказуемый порядок итератора () для классов java.util.HashSet и HashMap.keySet ()?

Шесть лет назад я прожигал несколько дней, пытаясь выследить, где мой совершенно детерминированный фреймворк реагирует случайным образом. После тщательного изучения всего фреймворка, убедившись, что он использует один и тот же экземпляр Random, я продолжил погоню за пошаговым кодом. Это был очень повторяющийся итеративный код самовызова. Хуже того, проклятый эффект проявится только после того, как будет выполнено огромное количество итераций. И спустя +6 часов я, наконец, сошел с ума, когда обнаружил в javadoc строку для HashSet.iterator (), указывающую, что она не гарантирует порядок, в котором будут возвращены элементы. Затем я просмотрел всю свою базу кода и заменил все экземпляры HashSet на LinkedHashSet. И, черт возьми, моя структура возникла прямо в детерминированную жизнь! ARGH!

Я только что испытал тот же самый FREAKIN аффект, снова (по крайней мере, на этот раз это было всего 3 часа). Для любой причины, Я упустил небольшую деталь о том, что HashMap ВЕДЕТ ТАК ЖЕ для своего keySet ().

Вот такая ветка на эту тему, хотя обсуждение никогда не дает полного ответа на мой вопрос: Порядок итераций HashSet

Итак , Мне любопытно, почему это могло произойти. Учитывая оба раза, у меня было огромное однопоточное Java-приложение, которое просматривало точно такое же пространство для создания / вставки с точно такими же параметрами JVM (несколько запусков из одного и того же командного файла) на одном компьютере и почти ничего не работало, что могло бы смутить JVM такая, что HashSet и HashMap после огромного количества итераций будут вести себя непредсказуемо (а не непоследовательно, как сказано в javadoc, чтобы не зависеть от порядка)?

Любые идеи по этому поводу из исходного кода (реализация этих классов в Джава. util) или из ваших знаний о JVM (возможно, какой-то сборщик мусора влияет на то, где внутренние классы Java получают ненулевую память при выделении пространств внутренней памяти)?

9
задан Community 23 May 2017 в 12:17
поделиться