2016-01-06 7 views
1

В какой-то пост я прочитал:Как элементы сгруппированы в ConcurrentHashMap на основе коэффициента нагрузки

ConcurrentHashMap группы элементов с помощью близости на основе loadfactor

  1. Как происходит эта группировка?

  2. Допустим, я переопределить hashCode() функцию, чтобы она всегда возвращает 1. Теперь, как это выше и ниже значения loadfactor будет эффект вставки в ConcurrentHashMap?.

  3. Теперь я переопределяю функцию hashCode() так, чтобы она всегда возвращала разные хэш-коды. Теперь как выше и ниже значения loadfactor будут вставляться в ConcurrentHashMap?.

ответ

0

Хешмап по существу представляет собой массив списков. Например, допустим, что данный хэш-массив имеет массив из 100 списков. Когда вы добавляете что-то к нему, хэш-код вычисляется для этого объекта. Затем модуль этого значения и количество списков (в этом случае 100) используются для определения того, к какому списку он добавляется. Поэтому, если вы добавите объект с hashcode 13, он добавится в список 13. Если вы добавите объект с кодом 16303512, он добавится в список 12.

Коэффициент загрузки указывает на хэш-карту, когда необходимо увеличить количество списки. Он основан на количестве элементов на всей карте и текущей емкости.

В вашем первом сценарии, где hashcode всегда возвращает 1, независимо от того, сколько списков есть, ваши объекты попадают в один список (это плохо). Во втором сценарии они будут распределяться более равномерно по всем (это хорошо.)

Поскольку коэффициент загрузки основывается на общем размере карты, а не на списке, качество ваших хэш-кодов на самом деле не взаимодействует с loadfactor. В первом сценарии он будет расти точно так же, как и во втором, но все будет в конечном итоге в том же списке независимо.

+0

[Фактор нагрузки в первую очередь связан с качеством хэш-функции.] (Http://stackoverflow.com/a/1573991/1371329) – jaco0646

+0

, если hashcode отвечает за распространение, а затем, когда loadfactor появляется на картинке и как это влияет распределение близко к 0 или 1 – quintin

+0

Как я уже объяснил, если все ваши объекты имеют одинаковый хэш-код, коэффициент загрузки не имеет значения. Поиск на карте вырождается до выполнения поиска в несортированном списке. – JimmyJames