getNode方法是不是有问题啊 key对应的value本来就是null呢?怎么能直接认为映射中没有这个key-value键值对呢
来源:7-6 基于链表的映射实现
腼腆的老黄
2018-07-09
如题
3回答
-
liuyubobobo
2018-07-10
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标准库保持一致:)
20 -
Rabbitism
2018-12-27
估计全世界只有我一个人是用C#上这门课的吧hhh
刚刚看了一下.net core的源代码,getvalue这个操作是用indexer实现的,这样就可以像取下标一样用dict[key]来取值了。.net core中如果key不存在,indexer取值会抛出KeyNotFoundException.
112018-12-27 -
mrglint
2018-07-21
当年没好好读书 好多数学基础都忘光了。。。如何重新拾起啊 波波老师 能推荐一些书吗
012018-07-22
相似问题