Возможна ли ситуация, когда HashMap выродится в список даже с ключами, имеющими разные hashCode()
Да, это возможно. Разные значения hashCode() могут попадать в одну корзину после операции hash & (capacity - 1). Например, при capacity = 16 ключи с hashCode 1, 17, 33, 49 попадут в одну корзину (все дают остаток 1 при делении на 16).
Это происходит потому, что индекс корзины зависит не только от hashCode, но и от размера таблицы. Чем меньше capacity, тем выше вероятность коллизий. Именно поэтому HashMap дополнительно перемешивает хэш: hash = hashCode ^ (hashCode >>> 16) — старшие биты «подмешиваются» к младшим, чтобы уменьшить вероятность систематических коллизий.
С Java 8 даже в этом случае цепочка преобразуется в красно-черное дерево при достижении 8 элементов, ограничивая деградацию до O(log N).
На собеседовании: объясните, что разные hashCode могут давать одинаковый индекс корзины. Упомяните дополнительное перемешивание хэша и treeification как защиту от деградации.