Вероятность дальнейшего повышения производительности (в среднем) возрастет, если вы увеличите начальную емкость HashSet еще больше. Это связано с тем, что распределение значений хеш-функции объектов в вашем списке может быть таким, чтобы коллизии были более вероятными.
Например, с учетом следующего списка, все, кроме первой вставки, приведут к коллизии, несмотря на отсутствие повторяющихся значений. (Хеш-функция Java для целых чисел является значением самого целого числа, а HashSet использует открытую адресацию и линейное зондирование в случае коллизии).
[0,10,1,2,3,4,5,6,7]
или даже хуже, потому что каждая вставка должна проверять каждое несвободное пространство перед тем, как его можно вставить.
[0, 5, 25, 125]
В последнем примере 0 помещается в индекс 0. 5 первоначально идет в индекс 0, так как 5% размера (т. Е. 5) равно 0, поэтому затем идет в индекс 1. 125 перейдет в индекс 0, но 0 - в индекс 0, 5 для индекса 1 и 25 для индекса 2. Это означает, что после трех проверок 125 может наконец быть вставлен в индекс 3.
Если вы увеличите начальную пропускную способность, это уменьшит вероятность столкновений (в среднем) и уменьшит количество проверок, требуемых в случае столкновения (в среднем также). По умолчанию java использует коэффициент загрузки 0,75 как хороший баланс между производительностью и использованием памяти. Поэтому разделите на коэффициент нагрузки 0,75 и добавьте 1, чтобы получить хорошую начальную емкость.