在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)
返回true
, cache.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)”。