Поскольку может быть только один нулевой ключ, вы можете просто иметь специальное ссылочное значение (не в массиве), которое содержит значение объекта, сопоставленного с этим нулевым ключом (и, возможно, логическое значение, указывающее, установлено ли это значение).К сожалению, это, вероятно, усложнит итерацию.
Например,
private boolean isNullMapped = false;
private V nullValue = null;
public put(K key, V value)
{
if (key == null) { nullValue = value; }
...
}
В качестве альтернативы вы можете обернуть все ключи в объект-обертку (предположим, что вы все равно хотите использовать параллельные массивы вместо записей), и еслизначение, содержащееся в этом объекте-обертке, равно нулю, тогда он представляет собой нулевой ключ.
Например,
private static class KeyWrapper<K>
{
public K key;
}
Наконец, в качестве вопроса для рассмотрения, если у вас нет записей в ваших массивах, но вместо этого непосредственно хранят массивы K и V, тогда как вы учитываете различные ключи, которые совместно используют один и тот же хэш-код?Реализация java.util имеет массивы записей, которые также действуют как связанные списки, чтобы учесть эту возможность (и, кстати, нулевой ключ всегда сопоставляется с индексом массива 0).