【发布时间】:2015-08-11 20:24:30
【问题描述】:
我在一次采访中得到了以下问题。
我得到了一个这样的字符数组:
char[] characters = {'u', 'a', 'u', 'i', 'o', 'f', 'u'};
我需要获取每个字符的不同字符和计数:
u = 3
a = 1
i = 1
o = 1
f = 1
所以我用 Java 回答了以下代码:
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int i = 1;
for (char c : characters) {
if (map.containsKey(c)) {
int val = map.get(c);
map.put(c, ++val);
} else map.put(c, i);
}
面试官是一名解决方案架构师。他问我为什么在这里同时使用containsKey() 和get() 方法,并指出使用这两种方法是多余的。他的观点是什么?我在这里做错了什么?我的代码会导致性能问题等吗?
【问题讨论】:
-
如果 HashMap 中没有这样的键,get 方法将返回 null,因此您可以直接调用它并检查结果,而不是额外调用函数,在本例中为 containsKey。这些至少是我在这个问题上的 2 美分。
-
如果您已经知道要搜索的密钥,那为什么还要再次获取密钥?
-
我看到的是你可以完全删除变量
i,因为它在循环中是不变的。 -
他的意思是,你可以只调用一次
get,当且仅当get的结果为非空时,键才会出现在映射中。 -
据我所知,到目前为止所有的答案都是指特定的例子。一般来说,
containsKey和get的序列实际上 CAN 是有意义的 - 即,当键可以映射到值null时。 (这里并不严格相关,但我只想指出:不能盲目地将每个containsKey/get替换为单个get,但始终要考虑是否可能 是映射中的null值,即使在此示例中不是这种情况)
标签: java algorithm dictionary hash hashmap