是否可以在哈希表Java中添加没有值的键?

时间:2018-09-28 12:48:18

标签: java unit-testing junit hashtable

我正在尝试使用Java的Junit Test。我的目标是将哈希表创建为

unsafeCoerce

接下来,我想首先仅添加密钥。之后,当我有值时,将其添加到哈希表中的键中。

示例

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

我尝试使用null,但是在测试过程中我得到了

student.put("student1",null) ;

不可能吗?关于仅添加没有价值的钥匙的任何想法吗?

4 个答案:

答案 0 :(得分:2)

  

是否可以在哈希表Java中添加没有值的键?

简短答案:否

为什么?

因为

会抛出异常
/**
 * @ORM\Entity
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", hardDelete=false)
 */
class Folder extends Catalogue implements ParentCatalogueAware, ChildCatalogueAware
{    

并且在相同的源代码中具有验证

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

您可以改用地图。

答案 1 :(得分:1)

HashTable是较旧的实现,而HashMap是具有更多功能的高级版本。您不能在其上调用.equals()或.hashCode(),因为null不是对象。

HashMap是单线程应用程序的更好替代,或者由于同步会引入性能影响,因此不需要同步。如果需要Threadsafe选项,也可以使用ConcurrentHashMap

答案 2 :(得分:1)

The documentation说您不能:

  

将指定的键映射到此哈希表中的指定值。   键和值都不能为空。

如果需要密钥,最好的办法是使用一个空的HashTable作为值:

student.put("student1", new Hashtable<>());

答案 3 :(得分:0)

在大多数情况下,您无需担心将null放入HashMap中。您可以检查通过keySet()分配了哪些键,并将其他所有内容都视为null(因为从未分配过)。

但是,您对我的问题表明,您需要区分三种状态:键-值对,从未分配值的键和明确分配了null的键值。

由于默认的HashMap不支持此行为,因此您可以实现自己的实现Map接口的类。它基本上只包装HashMap,但有一些重要的例外情况:

  • 当您为键分配null的值时,会将键放入“ {NullKeys””的Set中,而不是HashMap中。
  • 检索密钥时,请检查它是否在“ NullKey” Set中。如果是,请返回null,否则请查看HashMap

有一些特殊情况(用null覆盖现有值等),但这是基本策略。

(除了在非常特殊的情况下,我不确定这是否是一个有用的类,但是它是否满足您的要求。)