本帖最后由 clevergump 于 2014-10-2 19:30 编辑
1. <K,V>中的K、V一共有两个类型,K和V各代表一个类型(当然假如K、V代表的类型相同,也还是有两个类型,而不是一个)。这里的 K 和 V 也可以换成其他字母,比如<A,B>也是可以的。同样地,class<T>中的T也可以换成任意大写字母,比如 class<A>, class<B>.....class<Z>都可以。这里分别使用 T K V 作为类的代表字母,只是业内习惯而已,因为他们分别是三个英文单词的首字母 Type Key Value,这种定义习惯的好处是可以让程序员见名知意。另外提醒你一点,K V T 都使用的是大写字母,我想可能是业内一种默认的规矩吧,默认使用大写字母代表类和接口,用小写字母代表属性、局部变量和方法,因为类和接口的名字的首字母都是大写字母,属性、局部变量、方法的名字的首字母都是小写字母。所以你这里写的小写字母 k y 是不符合习惯的。
2. 虽然 K 和 V各自代表的类型相互之间没有任何联系(注意:我说的是两个类型之间,不是K和V之间),但是K和V之间还是有联系的,该联系是:只要知道了Map中的 K 值,也就同时知道了V的值。举个例子来描述他们之间的联系吧:假如定义一个身份证号码的类 Id, 再定义一个中国人的类 ChinesePerson,我们知道每个中国人都有自己的身份证号,而且该号码在中国必定是唯一的。所以只要知道了该号码就一定能知道该号码所对应的那个人的相关信息(比如:姓名、出生日期、年龄、户口所在地等),但是,反过来,通过个人信息却不一定能唯一确定该信息对应的身份证号(毕竟中国人那么多,即使姓名、生日、户口所在地、住址都相同的人,也不一定只有一个,可能就有那么巧,偏偏有多个人同时满足以上所有条件)。所以当出现了这种情况:“从一方可以唯一确定另一方,但反过来,从另一方却不能唯一确定一方”的情况下,就可以使用Map来描述这两类事物之间的联系。你可以定义一个Map<Id, ChinesePerson>,这里的Map既不是用来描述 Id 的,也不是用来描述 ChinesePerson 的,而是用来描述二者之间的关系( Id 与 ChinesePerson之间的单方向映射关系,单方向是指:从 Id 到 ChinesePerson的单方向),所以毕老师说的“一个整体”,指的就是这种单方向的映射关系,这个关系牵连的事物有两个,但关系本身却只有一个,如果你想单独描述这两个事物,比如还是 Id 和ChinesePerson,那么完全可以定义class<T> , 那么在描述身份证号时,T就代表Id; 在描述中国人时,T就代表ChinesePerson。
3. 至于Map.Entry<K,V>,你可以理解为是定义在Map内部的一种Map,在源码Map.java 中写的是 Entry<K,V>,关于 Entry<K,V>中K和V 的分析,和上面 Map<K,V>的分析是相同的。
|