Недавно я узнал, что в хэш-картах Java 8 используется бинарное дерево вместо связанного списка, а хеш-код используется как фактор ветвления. Я понимаю, что в случае большого столкновения поиск восстанавливается до O (log n) из O (n) с помощью двоичных деревьев. Мой вопрос заключается в том, что хорошо делает это, так как амортизированная временная сложность по-прежнему равна O (1), а может быть, если вы принудительно сохраняете все записи в одном и том же ведре, предоставляя одинаковый хэш-код для всех мы видим значительную разницу во времени, но никто в здравом уме не сделает этого.Почему хеш-карты в Java 8 используют бинарное дерево вместо связанного списка?
Двоичное дерево также использует больше пространства, чем односвязный список, поскольку в нем хранятся как левый, так и правый узлы. Зачем увеличивать пространственную сложность, когда нет абсолютно никакого улучшения во времени, за исключением некоторых ложных тестовых случаев.
Это не дебаты. Я цитирую: * Мой вопрос в том, что хорошо делает это [...], может быть, если вы [...], мы увидим значительную разницу во времени, но никто в здравом уме не сделает этого. *. Таким образом, вы говорите, что оно предназначено для обработки случая, который никто в здравом уме не сделал бы, поэтому разработчики ** явно ** обрабатывали немой случай, следовательно, разработчики немые и что вы держите Истину. Предлагаю переформулировать ваш вопрос. – Tunaki
Ваш вопрос не имеет смысла. Если вы предполагаете, что хеш-коллизий не произойдет, то двоичное дерево не * потребляет больше места, поскольку бинарное дерево будет использоваться только тогда, когда есть * хэш-коллизии. Чтобы быть более точным, количество столкновений должно превышать порог до того, как реализация переключится с связанного списка на двоичное дерево. – Holger
@ Tunaki Я специально имел в виду людей, намеренно пытающихся продемонстрировать это сценарий, и если бы я думал, что в этом нет ничего больше, я бы никогда не задавал его как вопрос. – user1613360