在Java中为HashMap添加一个空键或值有什么用?

HashMap允许一个空键和任意数量的空值。 它有什么用处?

我不是你正在询问的东西,但是如果你正在寻找一个什么时候想要使用空密钥的例子,我经常在地图中使用它们来表示默认情况(即应该使用的值如果给定的密钥不存在):

 Map<A, B> foo; A search; B val = foo.containsKey(search) ? foo.get(search) : foo.get(null); 

HashMap专门处理空键(因为它不能在空对象上调用.hashCode() ),但空值没有什么特别的,它们像其他任何东西一样存储在地图中

一个例子就是对树进行build模。 如果您使用HashMap来表示树结构,其中键是父级,值是子级列​​表,则null键的值将是根节点。

null 使用的一个例子是当使用HashMap作为高速caching(例如对外部Web服务的调用)的结果的caching时,该caching可能返回null

在映射中放置一个null值,然后允许区分给定键( cache.containsKey(someKey)返回false )的操作没有执行的情况,以及操作已经执行但是返回了null值的情况cache.containsKey(someKey)返回truecache.get(someKey)返回null )。

如果没有null值,则必须在caching中放置一些特殊值来指示null响应,或者根本不caching该响应并每次执行操作。

这是我唯一有点人为的例子,其中null键可以是有用的:

 public class Timer { private static final Logger LOG = Logger.getLogger(Timer.class); private static final Map<String, Long> START_TIMES = new HashMap<String, Long>(); public static synchronized void start() { long now = System.currentTimeMillis(); if (START_TIMES.containsKey(null)) { LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms"); } START_TIMES.put(null, now); } public static synchronized long stop() { if (! START_TIMES.containsKey(null)) { return 0; } return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis()); } public static synchronized void start(String name) { long now = System.currentTimeMillis(); if (START_TIMES.containsKey(name)) { LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms"); } START_TIMES.put(name, now); } public static synchronized long stop(String name) { if (! START_TIMES.containsKey(name)) { return 0; } return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis()); } private static long printTimer(String name, long start, long end) { LOG.info(name + " timer ran for " + (end - start) + "ms"); return end - start; } } 

到目前为止的答案只考虑有一个null的价值,但问题也问any number of null values

在HashMap中存储值为null的值的好处与在数据库中相同 – 您可以logging具有空值(例如string“”)和根本没有值之间的区别(null )。

另一个例子:我用它来按date分组数据。 但有些数据没有date。 我可以将它与标题“NoDate”

当映射存储用于UIselect的数据时,null键也可能很有用,其中映射键表示bean字段。

例如,在UIselect中将相应的空字段值表示为“(请select)”。