源码有感

今天又是平凡无奇的一天,上班打开电脑 ,过着自己的上班生活。
偶然之间看到了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源码,当时听他讲源码的时候都特别惊讶源码的设计思想和理念的优秀,对于一些逻辑思考的完善 代码的简洁都是很完美的体现。在对比一下自己那粗糙 糟糕的代码,感觉自己都不像是一个码农了。

进来随着搬砖生活的开始,自己也开始在看公司项目上的一些源码,在看源码的时候不得不感到源码的精彩和漂亮。对于其中的很多思想和使用是我们在平常的学习中获取不到的。

抽象、封装 、继承、多态这几种面向对象的思想在源码中应用的特别的好 ,也符合很多设计模式的思想理念。比如 开闭原则 单一原则、里氏代换、依赖倒置等,而自己在平常学习 使用中也都没有往这方面思考过,不懂得如何去更加好的设计 编写自己的代码。通过这次的经验,希望自己以后也能慢慢的开始读源码吧。

现在也能慢慢的感受到为什么很多人倡导要读源码了,对于源码 那是思想的凝聚,设计的升华,代码的结晶,对于一定工作经验的人来说,后期想继续提升 读源码也是最好的方式了。读源码也就像与一位老者对话,你们交谈的越多,越能感受到老者思想的深邃。当然对于目前初学的自己来说,不需要太过于深追源码,只需要培养自己读源码的想法偶尔看看源码的设计,如果一心专研源码很容易让自己陷入其中,也可能会造成坏的影响 从入门到放弃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值