今天又是平凡无奇的一天,上班打开电脑 ,过着自己的上班生活。
偶然之间看到了HashMap和HashTable的关系,突然对他们两有了点小兴趣,便随手new了他们的对象。
Map map = new HashMap<String,Object>();
Map table = new Hashtable<String,Object>();
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
public class Hashtable<K,V> extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
对于他们的类声明,有着共同的老祖宗 接口Map,但他们的老父亲两个不同的人,HashMap继承于AbstractMap,HashTable继承于Dictionary。对于AbstractMap 这个抽象类不出意外的实现了Map接口,而Dictionary,这个抽象类却没见过他,查看他的接口,也只是有着两个自己的方法。
Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。
给出键和值,你就可以将值存储在Dictionary对象中。一旦该值被存储,就可以通过它的键来获取它。所以和Map一样, Dictionary也可以作为一个键/值对列表。
Dictionary和map结构差不多,都是KV键值对来进行 数据存储,如今作为一个过时的类 不被人所听闻。
说说AbstractMap吧,他作为Map的一个抽象实现类,他实现Map中的很多方法,为后续继承他的子类提供方便,子类默认继承而无需再去实现这些方法。当然对于子类所需要的个性化设置也可以进行方法的重写。
对于AbstractMap,他实现了接口Map,又被HashMap所继承,他们中的抽象 继承 实现等概念的使用是及其精妙的。对于这些知识点 我们在学习面向对象的时候也都有所了解,知道会用,但是在真正实操的时候感觉还是有差距。
这次看Map源码的时候,无意中发现了一个惊喜。对于之前使用Map进行遍历的时候,Map.Entry<Object, Object> entry = iterator.next(); 在对这句话一直都没有什么想法,如果不是idea遍历的快捷键自动生成 或许我都不知道他的类型是Map.Entry<>。
之前对于他们的使用,也只是在学的时候知道他,然后通过快捷键知道怎么用,一直也都没有去了解为什么是这样的写法。记得自己之前用的时候,还以为是有Entry这么一个类,当时也很好奇既然是这样,那为什么还需要Map.Entry<>的方式,学艺不精的我也没有想到内部类那里去 ,只是简单的继续使用这种用法 ,同时 懒惰的自己也没有去深究为什么是这种用法。
很幸运的是这次看Map源码的时候看到了并且懂得了他的用法的含义,那就是在Map接口中定义了Entry接口,Entry当一个内部接口的作用。像内部接口在我们一般中使用的还是挺少的,自己在之前也都没有听过这个概念,直到到了今天才知道。也对,既然类中能有内部类,接口为什么就不能有内部接口呢?
也正是因为Entry是Map的一个内部接口,在外面的使用中我们不能直接使用到Entry,必须通过Map.Entry的方式来使用。就像内部类我们使用也需要用 外部类.内部类 的方式来使用,道理都是相通的。而Entry定义在最上层的Map接口中,Map的后代也都可以默认拥有到这一接口且使用。
记得自己第一次看源码还是宋红康老师的解读HashMap源码,当时听他讲源码的时候都特别惊讶源码的设计思想和理念的优秀,对于一些逻辑思考的完善 代码的简洁都是很完美的体现。在对比一下自己那粗糙 糟糕的代码,感觉自己都不像是一个码农了。
进来随着搬砖生活的开始,自己也开始在看公司项目上的一些源码,在看源码的时候不得不感到源码的精彩和漂亮。对于其中的很多思想和使用是我们在平常的学习中获取不到的。
抽象、封装 、继承、多态这几种面向对象的思想在源码中应用的特别的好 ,也符合很多设计模式的思想理念。比如 开闭原则 单一原则、里氏代换、依赖倒置等,而自己在平常学习 使用中也都没有往这方面思考过,不懂得如何去更加好的设计 编写自己的代码。通过这次的经验,希望自己以后也能慢慢的开始读源码吧。
现在也能慢慢的感受到为什么很多人倡导要读源码了,对于源码 那是思想的凝聚,设计的升华,代码的结晶,对于一定工作经验的人来说,后期想继续提升 读源码也是最好的方式了。读源码也就像与一位老者对话,你们交谈的越多,越能感受到老者思想的深邃。当然对于目前初学的自己来说,不需要太过于深追源码,只需要培养自己读源码的想法偶尔看看源码的设计,如果一心专研源码很容易让自己陷入其中,也可能会造成坏的影响 从入门到放弃。