getNode方法中根据key寻找映射中是否存在相应的节点(Node),和value无关。所以不管key-value中的value是否为空,只要key存在,getNode就不会返回空。
get方法确实存在语意歧义的问题,即get返回为空时,有两种可能:1)key存在,但是key对应的value为null;2)key不存在。事实上,我们的设计要求用户在使用get方法之前,应该先用contains方法判断一个key是否存在。即从map中取出一个键对应的值的标准写法应该是:(伪码)
if(map.contains(key))
value = map.get(key);
else
// key不存在进行的处理
这个设计和Java标准库的设计是保持一致的。Java语言的映射结构同样存在这样的语意歧义问题。可以进行如下实验:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
// 我们测试用的映射使用TreeMap
TreeMap<Character, Integer> map = new TreeMap<>();
map.put('a', null); // 将‘a’这个key对应的value设为null
System.out.println(map.get('a'));
// 打印null, 此时是key对应的value为null
System.out.println(map.get('b'));
// 打印null, 此时是key不存在
// 同样返回null, 存在语意歧义
System.out.println(map.containsKey('a'));
// 打印true,'a'这个key存在
System.out.println(map.containsKey('b'));
// 打印false,'b'这个key不存在
}
}
另外,存在一种Map的设计,完全不允许key-value的数据对中,value的值为null。当为一个key所对应的值赋空,意味着删除这个key。如果这样设计映射结构,则不存在get方法返回值语意的歧义性,但是损失了灵活性,key不再能对应null。有兴趣,可以尝试实现一个具备这个假设的映射结构:)
在我们的课程中,设计思路和Jav标准库保持一致:)