class Fib {
public Map<Integer, Integer> memo = new HashMap<Integer, Integer>();
Fib() {
memo.put(0, 1);
memo.put(1, 1);
}
public Integer fibonacciMemoized(Integer n) {
if (memo.containsKey(n)) {
return memo.get(n);
} else {
int fibo = fibonacciMemoized(n-1) + fibonacciMemoized(n-2);
return memo.put(n, fibo);
}
}
}
此代码提供NullPointerException
。但是,如果我将最后一个return语句分解为:
memo.put(n, fibo);
return fibo;
然后它的工作原理。怎么会?不会put()
返回放入地图的值吗?
答案 0 :(得分:3)
不,它没有。您可以在JavaDocs中阅读,其中明确指出put
会返回与密钥相关联的上一个值,如果没有密钥映射,则返回null
。
V put(K key, V value)
将指定的值与此映射中的指定键相关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定的值。 (当且仅当m.containsKey(k)返回true时,地图m才包含密钥k的映射。)
<强>参数:强>
key - 与指定值关联的键 value - 与指定键关联的值<强>返回:强> 与key关联的 previous 值,如果没有key的映射关系,则返回null。 (如果实现支持空值,则null返回也可以指示映射先前将null与key关联。)
因此,对于您的代码,必须使用以下内容:
memo.put(n, fibo); // will NOT return the value
return fibo; // and here it is returned
答案 1 :(得分:0)
Map.put
会返回给定密钥的上一个值,而不是您现在分配给它的值。在您的情况下,当您第一次遇到每个密钥时,请致电put
,因此它会返回null
。