Похоже, что в этой части есть проблема:
if(Double.compare((numKeys/size),loadFactor)>0){
this.reinitialize();
}
Поскольку numKeys
и size
оба являются целыми числами, это целочисленное деление - т.е. оно округляется в меньшую сторону. Таким образом, результат деления будет больше, чем loadFactor
только тогда, когда numKeys
и size
равны, что фактически означает, что ваш класс ведет себя как хеш-таблица с коэффициентом загрузки 1, а не 0,5. Это приводит к тому, что ваша схема открытой адресации ухудшается до сложности O (n) вместо O (1).
Решение состоит в том, чтобы изменить это условие, чтобы оно выполняло сравнение правильно. Во-первых, будьте осторожны, когда делите целые числа, но вы хотите, чтобы ответ был двойным;Вы должны разыграть удвоение перед делением. Во-вторых, не используйте Double.compare
, если вместо этого вы можете использовать <
или >
. Фиксированная версия выглядит следующим образом:
if((double) numKeys / size > loadFactor) {
this.reinitialize();
}
Или, чтобы полностью избежать разделения, вы можете эквивалентно проверить, если numKeys > loadFactor * size
.