Можно ли добавить ключ без значения в хеш-таблицу Java? - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь работать с тестом Java Junit.Моя цель - создать хеш-таблицу как

Hashtable< String , Hashtable<String,String> > student = 
    new Hashtable<String, Hashtable<String, String>>(); 

Далее я хочу добавить сначала только ключ.После этого, когда у меня есть значение, добавьте его в ключ в хеш-таблице.

Пример

student.put("student1",null) ;

Я пытался работать с нулем, но во время процесса тестированияЯ получаю

java.lang.NullPointerException

Разве это не возможно?Есть идеи, как добавить только ключ без значения?

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

В большинстве случаев вам не нужно помещать null в HashMap.Вы можете проверить, какие клавиши имеют значение, назначенное с помощью keySet(), и рассматривать все остальное как null (поскольку оно никогда не назначалось).

Однако ваш вопрос ко мне указывает на то, что вам необходимо различать три состояния: Пара ключ-значение, ключ, которому никогда не присваивалось значение, и ключи, которым явно присвоено значение null.

Поскольку значение по умолчанию HashMap не поддерживает это поведение,Вы могли бы реализовать свой собственный класс, который реализует интерфейс Map.В основном это только HashMap, с несколькими важными исключениями:

  • Когда вы назначаете ключу значение null, вы помещаете ключ в Set из «NullKeys»вместо HashMap.
  • Когда вы получаете ключ, проверьте, находится ли он в «NullKey» Set.Если да, верните null, в противном случае посмотрите на HashMap.

Существуют некоторые особые случаи (перезапись существующего значения с помощью null и т. Д.), Но это будет основной стратегией.

(Я не уверен, что этот класс полезен для других, кроме очень специализированных сценариев, но он будет соответствовать вашим требованиям.)

0 голосов
/ 28 сентября 2018

Можно ли добавить ключ без значения в хэш-таблице Java?

Краткий ответ: Нет

Почему?

Потому что он выдаст и исключение, если

 * @exception  NullPointerException  if the key or value is
 *               <code>null</code>

И в том же исходном коде есть проверка

 public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }
...

Вместо него можно использовать карту.

0 голосов
/ 28 сентября 2018

В документации сказано, что вы не можете:

Сопоставляет указанный ключ с указанным значением в этой хеш-таблице. Ни ключ, ни значение не могут быть нулевыми.

Лучшее, что вы можете сделать, если вам нужен ключ, это использовать пустой HashTable в качестве значения:

student.put("student1", new Hashtable<>());
0 голосов
/ 28 сентября 2018

HashTable - более старая реализация, и HashMap вышла как расширенная версия с большим количеством возможностей.Вы не можете вызвать .equals () или .hashCode (), так как null не является объектом.

HashMap - лучшая замена для однопоточных приложений, или любая синхронизация времени не является обязательной из-за влияния синхронизации на производительность.Если вам нужна опция Threadsafe, вы также можете использовать ConcurrentHashMap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...