Ответ
В Java 8 при достижении размера 8 элементов в LinkedList внутри HashMap происходит преобразование в TreeNode (красно-черное дерево) для улучшения производительности с O(n) до O(log n). Обратное преобразование (из TreeNode обратно в LinkedList) происходит при уменьшении размера до 6 элементов (гистерезис для избежания частых преобразований).
Пример кода (из исходников HashMap):
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6; Ответ 18+ 🔞
Э, слушай, вот это прикол, блядь! Сидишь ты такой, пишешь на Java, думаешь — ну HashMap, обычная мапа, чё там сложного. А потом бац — и выясняется, что там внутри целый ёперный театр с превращениями!
Представь себе: у тебя в HashMap лежит LinkedList в каждой корзине. Ну, типа, стандартная история, всё просто. Но потом, когда в этой связке элементов становится ровно восемь — ёбааать! — происходит магия. Эта цепочка не просто так, а превращается в красно-чёрное дерево, в этот самый TreeNode. Это типа как из гусеницы бабочка, только для данных, понимаешь?
А смысл-то в чём? А смысл, чувак, в том, что поиск в связном списке — это пиздец как медленно, O(n). Можешь там все восемь перебрать, пока найдёшь нужный. А в дереве — красота, O(log n). То есть ты сразу на несколько порядков быстрее становишься. Умные ребята из Oracle не просто так хитрую жопу включили.
Но и это ещё не всё, я тебя умоляю! Они же не идиоты, чтобы дерево туда-сюда дёргать. Вот смотри: превратили в дерево при 8 элементах. А обратно, в обычный список, оно вернётся только когда элементов станет шесть. Не пять, заметь, а именно шесть! Это называется гистерезис, э бошка думай! Чтобы если у тебя элемент добавился, потом удалился (стало семь), и тут же снова добавился (опять восемь) — система не начала бздеть и не стала каждую секунду перестраивать структуру туда-сюда. Доверия ебать ноль к таким частым переключениям, они же ресурсы жрут. Вот и сделали буферную зону.
Вот смотри, как в исходниках это выглядит, тут всё честно:
static final int TREEIFY_THRESHOLD = 8; // Порог "одеревенения", блядь
static final int UNTREEIFY_THRESHOLD = 6; // Порог "разодеревенения"
Ни хуя себе, да? Казалось бы, мелочь, а как продумано. Сидишь и думаешь: вот же мудя какая хитрая, но эффективная. С одной стороны, на больших данных скорость охуенная, с другой — на мелких нет лишних накладных расходов. Волнение ебать, когда понимаешь, сколько мозгов в эту, казалось бы, стандартную структуру вложили. Сам от себя охуел, когда первый раз в сорцы залез и это увидел.